import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import spacetraders_sdk/models/scanned_ship_engine.{type ScannedShipEngine} import spacetraders_sdk/models/scanned_ship_frame.{type ScannedShipFrame} import spacetraders_sdk/models/scanned_ship_mount.{type ScannedShipMount} import spacetraders_sdk/models/scanned_ship_reactor.{type ScannedShipReactor} import spacetraders_sdk/models/ship_nav.{type ShipNav} import spacetraders_sdk/models/ship_registration.{type ShipRegistration} import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} pub type ScannedShip { ScannedShip( symbol: ShipSymbol, registration: ShipRegistration, nav: ShipNav, frame: Option(ScannedShipFrame), reactor: Option(ScannedShipReactor), engine: ScannedShipEngine, mounts: Option(List(ScannedShipMount)), ) } pub fn decoder() -> Decoder(ScannedShip) { use symbol <- decode.field("symbol", ship_symbol.decoder()) use registration <- decode.field("registration", ship_registration.decoder()) use nav <- decode.field("nav", ship_nav.decoder()) use frame <- decode.optional_field( "frame", option.None, decode.optional(scanned_ship_frame.decoder()), ) use reactor <- decode.optional_field( "reactor", option.None, decode.optional(scanned_ship_reactor.decoder()), ) use engine <- decode.field("engine", scanned_ship_engine.decoder()) use mounts <- decode.optional_field( "mounts", option.None, decode.optional(decode.list(scanned_ship_mount.decoder())), ) decode.success(ScannedShip( symbol:, registration:, nav:, frame:, reactor:, engine:, mounts:, )) }