import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} pub type ShipNavStatus { InTransit InOrbit Docked } pub fn parse(value: String) -> Result(ShipNavStatus, Nil) { case value { "IN_TRANSIT" -> Ok(InTransit) "IN_ORBIT" -> Ok(InOrbit) "DOCKED" -> Ok(Docked) _ -> Error(Nil) } } pub fn decoder() -> Decoder(ShipNavStatus) { use value <- decode.then(decode.string) case parse(value) { Ok(ship_nav_status) -> decode.success(ship_nav_status) Error(Nil) -> decode.failure(InTransit, "ShipNavStatus") } } pub fn to_string(ship_nav_status: ShipNavStatus) -> String { case ship_nav_status { InTransit -> "IN_TRANSIT" InOrbit -> "IN_ORBIT" Docked -> "DOCKED" } } pub fn encode(ship_nav_status: ShipNavStatus) -> Json { json.string(to_string(ship_nav_status)) }