51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
from dataclasses import dataclass
|
|
from functools import cached_property
|
|
|
|
from sqlalchemy import inspect
|
|
|
|
|
|
@dataclass
|
|
class Parser:
|
|
data: dict
|
|
|
|
@property
|
|
def object_type(self):
|
|
raise NotImplementedError()
|
|
|
|
@cached_property
|
|
def description(self):
|
|
def add_one_entry(entry):
|
|
desc = ""
|
|
if type(entry) == str:
|
|
desc += entry
|
|
elif type(entry) == dict:
|
|
if entry["type"] == "entries":
|
|
if "name" in entry:
|
|
desc += f"\n{entry['name']}\n"
|
|
for subentry in entry["entries"]:
|
|
desc += add_one_entry(subentry)
|
|
else:
|
|
desc += f"\n[UNSUPPORTED ENTRY TYPE: {entry['type']}"
|
|
return desc
|
|
|
|
return "\n".join([add_one_entry(entry) for entry in self.data.get("entries", [])])
|
|
|
|
@property
|
|
def requires_attunement(self):
|
|
return True if self.data.get("reqAttune", None) else False
|
|
|
|
def parse(self):
|
|
params = {}
|
|
mapped = inspect(self.object_type)
|
|
for col in mapped.columns.keys():
|
|
val = getattr(self, col, None)
|
|
if val:
|
|
params[col] = val
|
|
return self.object_type(**params)
|
|
|
|
def __getattr__(self, attr_name):
|
|
try:
|
|
return self.data[attr_name]
|
|
except KeyError:
|
|
raise AttributeError()
|