import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import gleam/time/timestamp.{type Timestamp} import spacetraders_models/contract_deliver_good.{type ContractDeliverGood} import spacetraders_models/contract_payment.{type ContractPayment} import spacetraders_sdk/internal/time pub type ContractTerms { ContractTerms( deadline: Timestamp, payment: ContractPayment, deliver: Option(List(ContractDeliverGood)), ) } pub fn decoder() -> Decoder(ContractTerms) { use deadline <- decode.field("deadline", time.rfc3339_timestamp_decoder()) use payment <- decode.field("payment", contract_payment.decoder()) use deliver <- decode.optional_field( "deliver", option.None, decode.optional(decode.list(contract_deliver_good.decoder())), ) decode.success(ContractTerms(deadline:, payment:, deliver:)) }