import gleam/dynamic/decode.{type Decoder} import spacetraders_models/cooldown.{type Cooldown} import spacetraders_models/ship_cargo.{type ShipCargo} import spacetraders_models/ship_crew.{type ShipCrew} import spacetraders_models/ship_engine.{type ShipEngine} import spacetraders_models/ship_frame.{type ShipFrame} import spacetraders_models/ship_fuel.{type ShipFuel} import spacetraders_models/ship_module.{type ShipModule} import spacetraders_models/ship_mount.{type ShipMount} import spacetraders_models/ship_nav.{type ShipNav} import spacetraders_models/ship_reactor.{type ShipReactor} import spacetraders_models/ship_registration.{type ShipRegistration} import spacetraders_models/ship_symbol.{type ShipSymbol} pub type Ship { Ship( symbol: ShipSymbol, registration: ShipRegistration, nav: ShipNav, crew: ShipCrew, frame: ShipFrame, reactor: ShipReactor, engine: ShipEngine, modules: List(ShipModule), mounts: List(ShipMount), cargo: ShipCargo, cooldown: Cooldown, fuel: ShipFuel, ) } pub fn decoder() -> Decoder(Ship) { 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 crew <- decode.field("crew", ship_crew.decoder()) use frame <- decode.field("frame", ship_frame.decoder()) use reactor <- decode.field("reactor", ship_reactor.decoder()) use engine <- decode.field("engine", ship_engine.decoder()) use modules <- decode.field("modules", decode.list(ship_module.decoder())) use mounts <- decode.field("mounts", decode.list(ship_mount.decoder())) use cargo <- decode.field("cargo", ship_cargo.decoder()) use cooldown <- decode.field("cooldown", cooldown.decoder()) use fuel <- decode.field("fuel", ship_fuel.decoder()) decode.success(Ship( symbol:, registration:, nav:, crew:, frame:, reactor:, engine:, modules:, mounts:, cargo:, cooldown:, fuel:, )) }