import birl.{type Time} import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import spacetraders_sdk/models/contract_id.{type ContractId} import spacetraders_sdk/models/contract_terms.{type ContractTerms} import spacetraders_sdk/models/contract_type.{type ContractType} import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} import spacetraders_sdk/utils/api pub type Contract { Contract( id: ContractId, faction_symbol: FactionSymbol, type_: ContractType, terms: ContractTerms, accepted: Bool, fulfilled: Bool, deadline_to_accept: Option(Time), ) } pub fn decoder() -> Decoder(Contract) { use id <- decode.field("id", contract_id.decoder()) use faction_symbol <- decode.field("factionSymbol", faction_symbol.decoder()) use type_ <- decode.field("type", contract_type.decoder()) use terms <- decode.field("terms", contract_terms.decoder()) use accepted <- decode.field("accepted", decode.bool) use fulfilled <- decode.field("fulfilled", decode.bool) use deadline_to_accept <- decode.optional_field( "deadlineToAccept", option.None, decode.optional(api.time_decoder()), ) decode.success(Contract( id:, faction_symbol:, type_:, terms:, accepted:, fulfilled:, deadline_to_accept:, )) }