summaryrefslogtreecommitdiff
path: root/src/FundLab.Api/MarketData.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-22 03:48:12 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-22 03:48:12 +0800
commitb5a80f69cb2e2793e5134e23a0eb3e72cdbdbe0b (patch)
treeeeb22106ceb0d1eb0fe07b7bff18450af11e0d50 /src/FundLab.Api/MarketData.fs
parent7dd0e3f42105569b6e6ec02aeeec9b5a8bbd9dd3 (diff)
downloadfund-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.fs25
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
}
}