Skip to content
CAI
Software that uses CAICheck a score

slaveOftime/Fun.OData

58.0

Adequate · 3 October 2026

1.4k

lines of production code

F#

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Fun.OData is an F\# library that provides a domain-specific language for composing OData query strings using computation expressions and discriminated unions. It integrates with the Giraffe web framework to handle query execution and serialization, while also offering utilities for client-side data retrieval in Blazor WebAssembly applications. The system supports standard OData operations such as filtering, ordering, and pagination, with built-in benchmarks and demo applications to validate performance and usage patterns.

Features

Add OData query processing helper and benchmark entry point

The ODataDemo.Server now includes a new OData.fs module that provides an ODataResult type and an extension method for ODataQueryOptions to handle query execution with specific settings like a page size of 30 and constant parameterization. Additionally, a new Program.fs file in the Fun.OData.Query.Benchmarks project has been added to initialize and run benchmarks for query generation, specifically targeting custom queries with discriminated unions and custom expressions.

ODataDemo.Server, src/Fun.OData.Query.Benchmarks · high confidence

Initial project scaffolding and repository setup

This change establishes the initial structure for the Fun.OData library by adding the solution file (Fun.OData.sln) which defines the project hierarchy including the core query library, Giraffe integration, benchmarks, tests, and demo applications. It also introduces essential repository metadata files: a .gitignore to exclude build artifacts and IDE caches, a LICENSE file adopting the MIT license, and a README.md documenting the library's usage for building OData query strings via F\# computation expressions and discriminated unions.

(repo-wide) · high confidence

Introduce F\# DSL for composing OData query strings

Added a new set of F\# source files (DslCE.fs, Filter.fs, Query.fs, Utils.fs) that provide a domain-specific language for building OData queries. This includes a \Query\ discriminated union for defining operations like $select, $expand, $filter, and $orderBy, along with helper functions to combine these into valid OData query strings. The implementation supports automatic expansion of nested record types, handling of boolean and string values in filters, and URL encoding for string values.

src/Fun.OData.Query · high confidence

Introduces OData result handling and configuration options

The Fun.OData.Giraffe library now includes a Domain module defining the core data structures for OData processing. This introduces an ODataResult type that supports returning a count alongside query values, and an ODataProp discriminated union that allows users to configure query settings, entity sets, source data, and serialization. Notably, it adds support for serializing results to JSON via a ToJson property and a new IODataSerializer interface for custom serialization strategies. The module also defines DefaultODataOptions with boolean flags for UseGlobalEdmModel and ForceSelect, enabling finer control over how OData models and queries are constructed.

Fun.OData.Giraffe · high confidence

Introduces a fluent DSL for OData query handling in Giraffe

Adds a new \Dsl.fs\ module providing a fluent API to configure and execute OData queries within Giraffe applications. This allows developers to define query sources (from DI services, sequences, or context), apply entity set configurations, and handle serialization (including fallback to JSON if \IODataSerializer\ is missing) using a composable builder pattern (\ODataQuery\<'T\>\).

src/Fun.OData.Giraffe · high confidence

New OData and Blazor demo application

A new demo application has been added to showcase an OData API backed by Entity Framework Core with a SQLite database, serving both server-side and WebAssembly Blazor clients. The server exposes OData endpoints for Users and Roles, includes Swagger UI for API exploration, and initializes sample data on startup. The client-side components allow users to load and view user details, supporting pagination via the 'take' parameter.

demo · high confidence

New OData query hooks for user data retrieval

Added a new \Hooks.fs\ module in the ODataDemo.Wasm project that extends \IComponentHook\ with methods for fetching user data via OData. This includes generic \ODataQuery\ and \ODataSingle\ helpers for deserializing JSON responses using F\#-aware serializers, as well as specific convenience methods \LoadUsers\ (supporting optional top-count filtering and name-based ordering) and \LoadUserDetail\ for retrieving individual user profiles with their associated roles.

ODataDemo.Wasm · high confidence

Test coverage

Add OData query generation benchmarks; Added DSL Computation Expression tests for OData query generation.

Dependencies

Initial project structure and dependency configuration for Fun.OData

This change introduces the foundational project files for the Fun.OData library and its associated demo application. It establishes the core query generator (Fun.OData.Query) targeting .NET Standard 2.0 with FSharp.Core 6.0.0, alongside a new Giraffe integration package (Fun.OData.Giraffe) depending on Giraffe 4.1.0 and Microsoft.AspNetCore.OData 7.5.7. The demo solution is configured with a .NET 6.0 server (using Fun.Blazor.Server 2.0.\, Microsoft.AspNetCore.OData 8.0.10, and Swashbuckle) and a WebAssembly client (using Fun.Blazor.Wasm 2.0.\, FSharp.SystemTextJson, and Microsoft.Extensions.Http), along with benchmark and test project scaffolding.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 60 → 58 (-2.4)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 73 → 73 (+0.0)
  • Architecture 97 → 100 (+2.8)
  • Maturity 57 → 57 (+0.0)
  • Readiness 57 → 57 (+0.0)
  • Security 61 → 53 (-7.9)

Resolved (2)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)

New (1)

  • No test project references Fun.OData.Giraffe (src/Fun.OData.Giraffe/Fun.OData.Giraffe.fsproj)

Architecture

  • Unchanged — 1 containers · 4 contexts · 0 edges

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

slaveOftime/Fun.OData was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 676d686c87ac1e39f77d1cfddd12cd24f52d9821 — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.