Options: add "VerifyKeys" Mixin and showcase it for OoT Logic Tricks

This commit is contained in:
Fabian Dill
2022-01-11 22:01:54 +01:00
parent ee190601ee
commit 3acd966241
3 changed files with 30 additions and 3 deletions

View File

@@ -244,7 +244,21 @@ class OptionNameSet(Option):
return cls.from_text(str(data))
class OptionDict(Option):
class VerifyKeys:
valid_keys = frozenset()
valid_keys_casefold: bool = False
@classmethod
def verify_keys(cls, data):
if cls.valid_keys:
dataset = set(word.casefold() for word in data) if cls.valid_keys_casefold else set(data)
extra = dataset - cls.valid_keys
if extra:
raise Exception(f"Found unexpected key {', '.join(extra)} in {cls}. "
f"Allowed keys: {cls.valid_keys}.")
class OptionDict(Option, VerifyKeys):
default = {}
supports_weighting = False
value: typing.Dict[str, typing.Any]
@@ -255,6 +269,7 @@ class OptionDict(Option):
@classmethod
def from_any(cls, data: typing.Dict[str, typing.Any]) -> OptionDict:
if type(data) == dict:
cls.verify_keys(set(data))
return cls(data)
else:
raise NotImplementedError(f"Cannot Convert from non-dictionary, got {type(data)}")
@@ -276,7 +291,7 @@ class ItemDict(OptionDict):
super(ItemDict, self).__init__(value)
class OptionList(Option):
class OptionList(Option, VerifyKeys):
default = []
supports_weighting = False
value: list
@@ -292,6 +307,7 @@ class OptionList(Option):
@classmethod
def from_any(cls, data: typing.Any):
if type(data) == list:
cls.verify_keys(set(data))
return cls(data)
return cls.from_text(str(data))