import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import models/module_symbol.{type ModuleSymbol} import models/ship_requirements.{type ShipRequirements} pub type ShipModule { ShipModule( symbol: ModuleSymbol, name: String, description: String, capacity: Option(Int), range: Option(Int), requirements: ShipRequirements, ) } pub fn decoder() -> Decoder(ShipModule) { use symbol <- decode.field("symbol", module_symbol.decoder()) use name <- decode.field("name", decode.string) use description <- decode.field("description", decode.string) use capacity <- decode.optional_field( "capacity", option.None, decode.optional(decode.int), ) use range <- decode.optional_field( "range", option.None, decode.optional(decode.int), ) use requirements <- decode.field("requirements", ship_requirements.decoder()) decode.success(ShipModule( symbol:, name:, description:, capacity:, range:, requirements:, )) }