import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import models/market_symbol.{type MarketSymbol} import models/market_trade_good.{type MarketTradeGood} import models/market_transaction.{type MarketTransaction} import models/trade_good.{type TradeGood} pub type Market { Market( symbol: MarketSymbol, exports: List(TradeGood), imports: List(TradeGood), exchange: List(TradeGood), transactions: Option(List(MarketTransaction)), trade_goods: Option(List(MarketTradeGood)), ) } pub fn decoder() -> Decoder(Market) { use symbol <- decode.field("symbol", market_symbol.decoder()) use exports <- decode.field("exports", decode.list(trade_good.decoder())) use imports <- decode.field("imports", decode.list(trade_good.decoder())) use exchange <- decode.field("exchange", decode.list(trade_good.decoder())) use transactions <- decode.optional_field( "transactions", option.None, decode.optional(decode.list(market_transaction.decoder())), ) use trade_goods <- decode.optional_field( "tradeGoods", option.None, decode.optional(decode.list(market_trade_good.decoder())), ) decode.success(Market( symbol:, exports:, imports:, exchange:, transactions:, trade_goods:, )) }