37 lines
834 B
Gleam
37 lines
834 B
Gleam
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))
|
|
}
|