diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-22 03:48:12 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-22 03:48:12 +0800 |
| commit | b5a80f69cb2e2793e5134e23a0eb3e72cdbdbe0b (patch) | |
| tree | eeb22106ceb0d1eb0fe07b7bff18450af11e0d50 /src/FundLab.Api/MarketData.fs | |
| parent | 7dd0e3f42105569b6e6ec02aeeec9b5a8bbd9dd3 (diff) | |
| download | fund-lab-b5a80f69cb2e2793e5134e23a0eb3e72cdbdbe0b.tar.gz | |
Add multi-source bond quote probe fields and daily fallback (3d-20)
Diffstat (limited to 'src/FundLab.Api/MarketData.fs')
| -rw-r--r-- | src/FundLab.Api/MarketData.fs | 25 |
1 files changed, 25 insertions, 0 deletions
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<JsonElement> + + 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 } } |
