from __future__ import annotations from enum import IntEnum, auto, Enum class Toggle(IntEnum): off = 0 on = 1 @classmethod def from_text(cls, text: str) -> Toggle: if text.lower() in {"off", "0", "false", "none", "null", "no"}: return Toggle.off else: return Toggle.on class Choice(IntEnum): @classmethod def from_text(cls, text: str) -> Choice: for option in cls: if option.name == text.lower(): return option raise KeyError( f'Could not find option "{text}" for "{cls.__name__}", known options are {", ".join(f"{option.name}" for option in cls)}') class Logic(Choice): no_glitches = auto() no_logic = auto() class Goal(Choice): ganon = auto() fast_ganon = auto() all_dungeons = auto() pedestal = auto() triforce_hunt = auto() class Accessibility(Choice): locations = auto() items = auto() beatable = auto() class Crystals(Enum): # can't use IntEnum since there's also random C0 = 0 C1 = 1 C2 = 2 C3 = 3 C4 = 4 C5 = 5 C6 = 6 C7 = 7 Random = -1 @staticmethod def from_text(text: str) -> Crystals: for option in Crystals: if str(option.value) == text.lower(): return option return Crystals.Random class WorldState(Choice): standard = auto() open = auto() retro = auto() inverted = auto() class Bosses(Choice): vanilla = auto() simple = auto() full = auto() chaos = auto() class Enemies(Choice): vanilla = auto() shuffled = auto() chaos = auto() mapshuffle = Toggle compassshuffle = Toggle keyshuffle = Toggle bigkeyshuffle = Toggle hints = Toggle if __name__ == "__main__": import argparse test = argparse.Namespace() test.logic = Logic.from_text("no_logic") test.mapshuffle = mapshuffle.from_text("ON") try: test.logic = Logic.from_text("owg") except KeyError as e: print(e) if test.mapshuffle: print("Mapshuffle is on") print(test)