@dataclass
class EnumType(AbstractType):
values: set[str] = field(default_factory=set)
full_match: str = ""
@classmethod
def from_json(cls, json: Any) -> Optional[EnumType]:
if json["kind"] == cls.__name__:
return EnumType(json["values"])
return None
@classmethod
def from_string(cls, string: str) -> Optional[EnumType]:
def remove_backslash(e: str) -> str:
e = e.replace(r"\"", '"')
e = e.replace(r"\'", "'")
return e
enum_match = re.search(r"{(.*?)}", string)
if enum_match:
quotes = "'\""
values = set()
enum_str = enum_match.group(1)
value = ""
inside_value = False
curr_quote = None
for i, char in enumerate(enum_str):
if char in quotes and (i == 0 or (i > 0 and enum_str[i - 1] != "\\")):
if not inside_value:
inside_value = True
curr_quote = char
elif inside_value:
if curr_quote == char:
inside_value = False
curr_quote = None
values.add(remove_backslash(value))
value = ""
else:
value += char
elif inside_value:
value += char
return EnumType(values, enum_match.group(0))
return None
def update(self, enum: EnumType) -> None:
self.values.update(enum.values)
def to_json(self) -> dict[str, Any]:
return {"kind": self.__class__.__name__, "values": self.values}
def __hash__(self) -> int:
return hash((frozenset(self.values), self.full_match))