import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} pub type ModuleSymbol { ModuleMineralProcessorI ModuleGasProcessorI ModuleCargoHoldI ModuleCargoHoldII ModuleCargoHoldIII ModuleCrewQuartersI ModuleEnvoyQuartersI ModulePassengerCabinI ModuleMicroRefineryI ModuleOreRefineryI ModuleFuelRefineryI ModuleScienceLabI ModuleJumpDriveI ModuleJumpDriveII ModuleJumpDriveIII ModuleWarpDriveI ModuleWarpDriveII ModuleWarpDriveIII ModuleShieldGeneratorI ModuleShieldGeneratorII } pub fn parse(value: String) -> Result(ModuleSymbol, Nil) { case value { "MODULE_MINERAL_PROCESSOR_I" -> Ok(ModuleMineralProcessorI) "MODULE_GAS_PROCESSOR_I" -> Ok(ModuleGasProcessorI) "MODULE_CARGO_HOLD_I" -> Ok(ModuleCargoHoldI) "MODULE_CARGO_HOLD_II" -> Ok(ModuleCargoHoldII) "MODULE_CARGO_HOLD_III" -> Ok(ModuleCargoHoldIII) "MODULE_CREW_QUARTERS_I" -> Ok(ModuleCrewQuartersI) "MODULE_ENVOY_QUARTERS_I" -> Ok(ModuleEnvoyQuartersI) "MODULE_PASSENGER_CABIN_I" -> Ok(ModulePassengerCabinI) "MODULE_MICRO_REFINERY_I" -> Ok(ModuleMicroRefineryI) "MODULE_ORE_REFINERY_I" -> Ok(ModuleOreRefineryI) "MODULE_FUEL_REFINERY_I" -> Ok(ModuleFuelRefineryI) "MODULE_SCIENCE_LAB_I" -> Ok(ModuleScienceLabI) "MODULE_JUMP_DRIVE_I" -> Ok(ModuleJumpDriveI) "MODULE_JUMP_DRIVE_II" -> Ok(ModuleJumpDriveII) "MODULE_JUMP_DRIVE_III" -> Ok(ModuleJumpDriveIII) "MODULE_WARP_DRIVE_I" -> Ok(ModuleWarpDriveI) "MODULE_WARP_DRIVE_II" -> Ok(ModuleWarpDriveII) "MODULE_WARP_DRIVE_III" -> Ok(ModuleWarpDriveIII) "MODULE_SHIELD_GENERATOR_I" -> Ok(ModuleShieldGeneratorI) "MODULE_SHIELD_GENERATOR_II" -> Ok(ModuleShieldGeneratorII) _ -> Error(Nil) } } pub fn decoder() -> Decoder(ModuleSymbol) { use value <- decode.then(decode.string) case parse(value) { Ok(module_symbol) -> decode.success(module_symbol) Error(Nil) -> decode.failure(ModuleMineralProcessorI, "ModuleSymbol") } } pub fn to_string(module_symbol: ModuleSymbol) -> String { case module_symbol { ModuleMineralProcessorI -> "MODULE_MINERAL_PROCESSOR_I" ModuleGasProcessorI -> "MODULE_GAS_PROCESSOR_I" ModuleCargoHoldI -> "MODULE_CARGO_HOLD_I" ModuleCargoHoldII -> "MODULE_CARGO_HOLD_II" ModuleCargoHoldIII -> "MODULE_CARGO_HOLD_III" ModuleCrewQuartersI -> "MODULE_CREW_QUARTERS_I" ModuleEnvoyQuartersI -> "MODULE_ENVOY_QUARTERS_I" ModulePassengerCabinI -> "MODULE_PASSENGER_CABIN_I" ModuleMicroRefineryI -> "MODULE_MICRO_REFINERY_I" ModuleOreRefineryI -> "MODULE_ORE_REFINERY_I" ModuleFuelRefineryI -> "MODULE_FUEL_REFINERY_I" ModuleScienceLabI -> "MODULE_SCIENCE_LAB_I" ModuleJumpDriveI -> "MODULE_JUMP_DRIVE_I" ModuleJumpDriveII -> "MODULE_JUMP_DRIVE_II" ModuleJumpDriveIII -> "MODULE_JUMP_DRIVE_III" ModuleWarpDriveI -> "MODULE_WARP_DRIVE_I" ModuleWarpDriveII -> "MODULE_WARP_DRIVE_II" ModuleWarpDriveIII -> "MODULE_WARP_DRIVE_III" ModuleShieldGeneratorI -> "MODULE_SHIELD_GENERATOR_I" ModuleShieldGeneratorII -> "MODULE_SHIELD_GENERATOR_II" } } pub fn encode(module_symbol: ModuleSymbol) -> Json { json.string(to_string(module_symbol)) }