import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} import models/chart.{type Chart} import models/system_symbol.{type SystemSymbol} import models/waypoint_faction.{type WaypointFaction} import models/waypoint_orbital.{type WaypointOrbital} import models/waypoint_symbol.{type WaypointSymbol} import models/waypoint_trait.{type WaypointTrait} import models/waypoint_type.{type WaypointType} pub type ScannedWaypoint { ScannedWaypoint( symbol: WaypointSymbol, type_: WaypointType, system_symbol: SystemSymbol, x: Int, y: Int, orbitals: List(WaypointOrbital), faction: Option(WaypointFaction), traits: List(WaypointTrait), chart: Option(Chart), ) } pub fn decoder() -> Decoder(ScannedWaypoint) { use symbol <- decode.field("symbol", waypoint_symbol.decoder()) use type_ <- decode.field("type", waypoint_type.decoder()) use system_symbol <- decode.field("systemSymbol", system_symbol.decoder()) use x <- decode.field("x", decode.int) use y <- decode.field("y", decode.int) use orbitals <- decode.field( "orbitals", decode.list(waypoint_orbital.decoder()), ) use faction <- decode.optional_field( "faction", option.None, decode.optional(waypoint_faction.decoder()), ) use traits <- decode.field("traits", decode.list(waypoint_trait.decoder())) use chart <- decode.optional_field( "chart", option.None, decode.optional(chart.decoder()), ) decode.success(ScannedWaypoint( symbol:, type_:, system_symbol:, x:, y:, orbitals:, faction:, traits:, chart:, )) }