40 lines
1,021 B
Gleam
40 lines
1,021 B
Gleam
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:,
|
|
))
|
|
}
|