import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import spacetraders_sdk/models/activity_level.{type ActivityLevel} import spacetraders_sdk/models/ship_engine.{type ShipEngine} import spacetraders_sdk/models/ship_frame.{type ShipFrame} import spacetraders_sdk/models/ship_module.{type ShipModule} import spacetraders_sdk/models/ship_mount.{type ShipMount} import spacetraders_sdk/models/ship_reactor.{type ShipReactor} import spacetraders_sdk/models/ship_type.{type ShipType} import spacetraders_sdk/models/shipyard_ship_crew.{type ShipyardShipCrew} import spacetraders_sdk/models/supply_level.{type SupplyLevel} pub type ShipyardShip { ShipyardShip( type_: ShipType, name: String, description: String, activity: Option(ActivityLevel), supply: SupplyLevel, purchase_price: Int, frame: ShipFrame, reactor: ShipReactor, engine: ShipEngine, modules: List(ShipModule), mounts: List(ShipMount), crew: ShipyardShipCrew, ) } pub fn decoder() -> Decoder(ShipyardShip) { use type_ <- decode.field("type", ship_type.decoder()) use name <- decode.field("name", decode.string) use description <- decode.field("description", decode.string) use activity <- decode.optional_field( "activity", option.None, decode.optional(activity_level.decoder()), ) use supply <- decode.field("supply", supply_level.decoder()) use purchase_price <- decode.field("purchasePrice", decode.int) 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 crew <- decode.field("crew", shipyard_ship_crew.decoder()) decode.success(ShipyardShip( type_:, name:, description:, activity:, supply:, purchase_price:, frame:, reactor:, engine:, modules:, mounts:, crew:, )) }