summaryrefslogtreecommitdiff
path: root/src/FundLab.Api/MarketData.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/FundLab.Api/MarketData.fs')
-rw-r--r--src/FundLab.Api/MarketData.fs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/FundLab.Api/MarketData.fs b/src/FundLab.Api/MarketData.fs
index ad2a623..87ef145 100644
--- a/src/FundLab.Api/MarketData.fs
+++ b/src/FundLab.Api/MarketData.fs
@@ -48,6 +48,17 @@ type MarketDataBondQuotePayload =
MaturityDate: DateOnly option
}
+type MarketDataStockQuotePayload =
+ {
+ Source: string
+ SourceRevision: string
+ CollectedAt: DateTimeOffset
+ Code: string
+ Name: string option
+ Price: decimal option
+ Currency: string
+ }
+
type MarketDataInstrumentRecord =
{
Code: string
@@ -354,3 +365,36 @@ module MarketData =
}
with
| :? JsonException -> Error "payload must be valid JSON"
+
+ let parseStockQuotePayload (json: string) : Result<MarketDataStockQuotePayload, string> =
+ try
+ use document = JsonDocument.Parse(json)
+ let root = document.RootElement
+
+ result {
+ let! source, sourceRevision, collectedAt = validateEnvelope root "stock-quote"
+ let! instrumentProperty = requiredProperty root "instrument"
+ let! codeProperty = requiredString instrumentProperty "code"
+
+ if not (isFundCode codeProperty) then
+ return! Error "stock code must contain exactly six digits"
+
+ let! quoteProperty = requiredProperty root "quote"
+ let! name = optionalString quoteProperty "name"
+ let! priceProperty = requiredProperty quoteProperty "price"
+ let! price = optionalDecimal "price" priceProperty
+ let! currency = requiredString quoteProperty "currency"
+
+ return
+ {
+ Source = source
+ SourceRevision = sourceRevision
+ CollectedAt = collectedAt
+ Code = codeProperty
+ Name = name
+ Price = price
+ Currency = currency
+ }
+ }
+ with
+ | :? JsonException -> Error "payload must be valid JSON"