def obj(definition: Definition) -> Base: def inner(definition: Definition, node: Base): for m in definition.model: if m.type == "object": inner_base = Base() if m.name: inner_base.__setattr__(m.name, Base()) inner_base = inner_base.__getattribute__(m.name) inner(m, inner_base) node.__setattr__(m.name, inner_base) else: value = switch(m) value = value.__getattribute__(m.name) node.__setattr__(m.name, value) root = Base() named_root = None if definition.name: root.__setattr__(definition.name, Base()) named_root = root.__getattribute__(definition.name) if named_root: inner(definition, named_root) else: inner(definition, root) return root
def inner(definition: Definition, node: Base): for m in definition.model: if m.type == "object": inner_base = Base() if m.name: inner_base.__setattr__(m.name, Base()) inner_base = inner_base.__getattribute__(m.name) inner(m, inner_base) node.__setattr__(m.name, inner_base) else: value = switch(m) value = value.__getattribute__(m.name) node.__setattr__(m.name, value)
def base(name: str, value: Union[bool, str, float, list]): if name: d = Base() d.__setattr__(name, value) return d return value