52 lines
1.6 KiB
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:,
|
|
))
|
|
}
|