diff options
Diffstat (limited to 'src/FundLab.Api/MarketData.fs')
| -rw-r--r-- | src/FundLab.Api/MarketData.fs | 44 |
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" |
