import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} pub type FactionSymbol { Cosmic Void Galactic Quantum Dominion Astro Corsairs Obsidian Aegis United Solitary Cobalt Omega Echo Lord Cult Ancients Shadow Ethereal } pub fn parse(value: String) -> Result(FactionSymbol, Nil) { case value { "COSMIC" -> Ok(Cosmic) "VOID" -> Ok(Void) "GALACTIC" -> Ok(Galactic) "QUANTUM" -> Ok(Quantum) "DOMINION" -> Ok(Dominion) "ASTRO" -> Ok(Astro) "CORSAIRS" -> Ok(Corsairs) "OBSIDIAN" -> Ok(Obsidian) "AEGIS" -> Ok(Aegis) "UNITED" -> Ok(United) "SOLITARY" -> Ok(Solitary) "COBALT" -> Ok(Cobalt) "OMEGA" -> Ok(Omega) "ECHO" -> Ok(Echo) "LORDS" -> Ok(Lord) "CULT" -> Ok(Cult) "ANCIENTS" -> Ok(Ancients) "SHADOW" -> Ok(Shadow) "ETHEREAL" -> Ok(Ethereal) _ -> Error(Nil) } } pub fn decoder() -> Decoder(FactionSymbol) { use value <- decode.then(decode.string) case parse(value) { Ok(faction_symbol) -> decode.success(faction_symbol) Error(Nil) -> decode.failure(Cosmic, "FactionSymbol") } } pub fn to_string(faction_symbol: FactionSymbol) -> String { case faction_symbol { Cosmic -> "COSMIC" Void -> "VOID" Galactic -> "GALACTIC" Quantum -> "QUANTUM" Dominion -> "DOMINION" Astro -> "ASTRO" Corsairs -> "CORSAIRS" Obsidian -> "OBSIDIAN" Aegis -> "AEGIS" United -> "UNITED" Solitary -> "SOLITARY" Cobalt -> "COBALT" Omega -> "OMEGA" Echo -> "ECHO" Lord -> "LORDS" Cult -> "CULT" Ancients -> "ANCIENTS" Shadow -> "SHADOW" Ethereal -> "ETHEREAL" } } pub fn encode(faction_symbol: FactionSymbol) -> Json { json.string(to_string(faction_symbol)) }