module FundLab.Api.Program open System open Giraffe open Microsoft.AspNetCore.Builder open Microsoft.Extensions.DependencyInjection let private requiredEnvironment name = match Environment.GetEnvironmentVariable(name) with | value when not (String.IsNullOrWhiteSpace value) -> value | _ -> failwithf "%s must be configured" name [] let main argv = let builder = WebApplication.CreateBuilder(argv) builder.Services |> App.addOptionFriendlyJson |> ignore builder.Services.AddGiraffe() |> ignore let repository = FundRepository(requiredEnvironment "FUND_LAB_DATABASE_URL") repository.EnsureSchema() repository.BackfillCashLedger() |> ignore let collector = ProcessMarketDataCollector.FromEnvironment() :> IMarketDataCollector let marketData = MarketDataService(repository, collector) :> IMarketDataService let navDateProbe = AkshareNavDateProbe(collector) :> INavDateProbe let navSeriesProbe = AkshareNavSeriesProbe(collector) :> INavSeriesProbe let bondQuoteProbe = AkshareBondQuoteProbe(collector) :> IBondQuoteProbe let stockQuoteProbe = AkshareStockQuoteProbe(collector) :> IStockQuoteProbe let stockDailyProbe = AkshareStockDailyProbe(collector) :> IStockDailyProbe let probes = { NavDates = navDateProbe NavSeries = navSeriesProbe BondQuotes = bondQuoteProbe StockQuotes = stockQuoteProbe StockDaily = stockDailyProbe } let app = builder.Build() app.UseGiraffe(App.createApplicationWithMarketDataAndProbes repository marketData probes) app.Run() 0