From b5a80f69cb2e2793e5134e23a0eb3e72cdbdbe0b Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Tue, 22 Sep 2026 03:48:12 +0800 Subject: Add multi-source bond quote probe fields and daily fallback (3d-20) --- src/FundLab.Api/MarketData.fs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/FundLab.Api/MarketData.fs') diff --git a/src/FundLab.Api/MarketData.fs b/src/FundLab.Api/MarketData.fs index 82da1c9..e621740 100644 --- a/src/FundLab.Api/MarketData.fs +++ b/src/FundLab.Api/MarketData.fs @@ -45,6 +45,9 @@ type MarketDataBondQuotePayload = Code: string Name: string option Price: decimal option + CleanPrice: decimal option + AccruedInterest: decimal option + Date: DateOnly option MaturityDate: DateOnly option } @@ -131,6 +134,16 @@ module MarketData = else Error(sprintf "payload property '%s' is required" name) + let private optionalProperty (root: JsonElement) (name: string) = + let mutable property = Unchecked.defaultof + + if root.ValueKind <> JsonValueKind.Object then + Error "payload root must be a JSON object" + elif root.TryGetProperty(name, &property) then + Ok(Some property) + else + Ok None + let private requiredString (root: JsonElement) name = requiredProperty root name |> Result.bind (fun property -> @@ -366,6 +379,15 @@ module MarketData = let! name = optionalString quoteProperty "name" let! priceProperty = requiredProperty quoteProperty "price" let! price = optionalDecimal "price" priceProperty + let! cleanPrice = + optionalProperty quoteProperty "clean_price" + |> Result.bind (function Some property -> optionalDecimal "clean_price" property | None -> Ok None) + let! accruedInterest = + optionalProperty quoteProperty "accrued_interest" + |> Result.bind (function Some property -> optionalDecimal "accrued_interest" property | None -> Ok None) + let! date = + optionalProperty quoteProperty "date" + |> Result.bind (function Some property -> optionalIsoDate "date" property | None -> Ok None) let! maturityProperty = requiredProperty quoteProperty "maturity_date" let! maturityDate = optionalIsoDate "maturity_date" maturityProperty @@ -377,6 +399,9 @@ module MarketData = Code = codeProperty Name = name Price = price + CleanPrice = cleanPrice + AccruedInterest = accruedInterest + Date = date MaturityDate = maturityDate } } -- cgit v1.2.3