gleam-spacetraders-sdk/src/spacetraders_sdk/models/scanned_ship.gleam

52 lines
1.6 KiB
Gleam

import gleam/dynamic/decode.{type Decoder}
import gleam/option.{type Option}
import spacetraders_sdk/models/scanned_ship_engine.{type ScannedShipEngine}
import spacetraders_sdk/models/scanned_ship_frame.{type ScannedShipFrame}
import spacetraders_sdk/models/scanned_ship_mount.{type ScannedShipMount}
import spacetraders_sdk/models/scanned_ship_reactor.{type ScannedShipReactor}
import spacetraders_sdk/models/ship_nav.{type ShipNav}
import spacetraders_sdk/models/ship_registration.{type ShipRegistration}
import spacetraders_sdk/models/ship_symbol.{type ShipSymbol}
pub type ScannedShip {
ScannedShip(
symbol: ShipSymbol,
registration: ShipRegistration,
nav: ShipNav,
frame: Option(ScannedShipFrame),
reactor: Option(ScannedShipReactor),
engine: ScannedShipEngine,
mounts: Option(List(ScannedShipMount)),
)
}
pub fn decoder() -> Decoder(ScannedShip) {
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 frame <- decode.optional_field(
"frame",
option.None,
decode.optional(scanned_ship_frame.decoder()),
)
use reactor <- decode.optional_field(
"reactor",
option.None,
decode.optional(scanned_ship_reactor.decoder()),
)
use engine <- decode.field("engine", scanned_ship_engine.decoder())
use mounts <- decode.optional_field(
"mounts",
option.None,
decode.optional(decode.list(scanned_ship_mount.decoder())),
)
decode.success(ScannedShip(
symbol:,
registration:,
nav:,
frame:,
reactor:,
engine:,
mounts:,
))
}