import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} pub type FrameSymbol { FrameProbe FrameDrone FrameInterceptor FrameRacer FrameFighter FrameFrigate FrameShuttle FrameExplorer FrameMiner FrameLightFreighter FrameHeavyFreighter FrameTransport FrameDestroyer FrameCruiser FrameCarrier FrameBulkFreighter } pub fn parse(value: String) -> Result(FrameSymbol, Nil) { case value { "FRAME_PROBE" -> Ok(FrameProbe) "FRAME_DRONE" -> Ok(FrameDrone) "FRAME_INTERCEPTOR" -> Ok(FrameInterceptor) "FRAME_RACER" -> Ok(FrameRacer) "FRAME_FIGHTER" -> Ok(FrameFighter) "FRAME_FRIGATE" -> Ok(FrameFrigate) "FRAME_SHUTTLE" -> Ok(FrameShuttle) "FRAME_EXPLORER" -> Ok(FrameExplorer) "FRAME_MINER" -> Ok(FrameMiner) "FRAME_LIGHT_FREIGHTER" -> Ok(FrameLightFreighter) "FRAME_HEAVY_FREIGHTER" -> Ok(FrameHeavyFreighter) "FRAME_TRANSPORT" -> Ok(FrameTransport) "FRAME_DESTROYER" -> Ok(FrameDestroyer) "FRAME_CRUISER" -> Ok(FrameCruiser) "FRAME_CARRIER" -> Ok(FrameCarrier) "FRAME_BULK_FREIGHTER" -> Ok(FrameBulkFreighter) _ -> Error(Nil) } } pub fn decoder() -> Decoder(FrameSymbol) { use value <- decode.then(decode.string) case parse(value) { Ok(frame_symbol) -> decode.success(frame_symbol) Error(Nil) -> decode.failure(FrameProbe, "FrameSymbol") } } pub fn to_string(frame_symbol: FrameSymbol) -> String { case frame_symbol { FrameProbe -> "FRAME_PROBE" FrameDrone -> "FRAME_DRONE" FrameInterceptor -> "FRAME_INTERCEPTOR" FrameRacer -> "FRAME_RACER" FrameFighter -> "FRAME_FIGHTER" FrameFrigate -> "FRAME_FRIGATE" FrameShuttle -> "FRAME_SHUTTLE" FrameExplorer -> "FRAME_EXPLORER" FrameMiner -> "FRAME_MINER" FrameLightFreighter -> "FRAME_LIGHT_FREIGHTER" FrameHeavyFreighter -> "FRAME_HEAVY_FREIGHTER" FrameTransport -> "FRAME_TRANSPORT" FrameDestroyer -> "FRAME_DESTROYER" FrameCruiser -> "FRAME_CRUISER" FrameCarrier -> "FRAME_CARRIER" FrameBulkFreighter -> "FRAME_BULK_FREIGHTER" } } pub fn encode(frame_symbol: FrameSymbol) -> Json { json.string(to_string(frame_symbol)) }