gleam-spacetraders-sdk/src/spacetraders_models/shipyard_ship.gleam

61 lines
2 KiB
Gleam

import gleam/dynamic/decode.{type Decoder}
import gleam/option.{type Option}
import spacetraders_models/activity_level.{type ActivityLevel}
import spacetraders_models/ship_engine.{type ShipEngine}
import spacetraders_models/ship_frame.{type ShipFrame}
import spacetraders_models/ship_module.{type ShipModule}
import spacetraders_models/ship_mount.{type ShipMount}
import spacetraders_models/ship_reactor.{type ShipReactor}
import spacetraders_models/ship_type.{type ShipType}
import spacetraders_models/shipyard_ship_crew.{type ShipyardShipCrew}
import spacetraders_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:,
))
}