from typing import Any, List, Optional, TypeVar, Callable, Type, cast from uuid import UUID T = TypeVar("T") def from_list(f: Callable[[Any], T], x: Any) -> List[T]: assert isinstance(x, list) return [f(y) for y in x] def to_class(c: Type[T], x: Any) -> dict: assert isinstance(x, c) return cast(Any, x).to_dict() def from_str(x: Any) -> str: assert isinstance(x, str) return x def from_int(x: Any) -> int: assert isinstance(x, int) and not isinstance(x, bool) return x def from_none(x: Any) -> Any: assert x is None return x def from_union(fs, x): for f in fs: try: return f(x) except: pass assert False class WelcomeCustomFields: pass def __init__(self, ) -> None: pass @staticmethod def from_dict(obj: Any) -> 'WelcomeCustomFields': assert isinstance(obj, dict) return WelcomeCustomFields() def to_dict(self) -> dict: result: dict = {} return result class Target: entity_iid: UUID layer_iid: UUID level_iid: UUID world_iid: UUID def __init__(self, entity_iid: UUID, layer_iid: UUID, level_iid: UUID, world_iid: UUID) -> None: self.entity_iid = entity_iid self.layer_iid = layer_iid self.level_iid = level_iid self.world_iid = world_iid @staticmethod def from_dict(obj: Any) -> 'Target': assert isinstance(obj, dict) entity_iid = UUID(obj.get("entityIid")) layer_iid = UUID(obj.get("layerIid")) level_iid = UUID(obj.get("levelIid")) world_iid = UUID(obj.get("worldIid")) return Target(entity_iid, layer_iid, level_iid, world_iid) def to_dict(self) -> dict: result: dict = {} result["entityIid"] = str(self.entity_iid) result["layerIid"] = str(self.layer_iid) result["levelIid"] = str(self.level_iid) result["worldIid"] = str(self.world_iid) return result class ButtonCustomFields: targets: List[Target] def __init__(self, targets: List[Target]) -> None: self.targets = targets @staticmethod def from_dict(obj: Any) -> 'ButtonCustomFields': assert isinstance(obj, dict) targets = from_list(Target.from_dict, obj.get("targets")) return ButtonCustomFields(targets) def to_dict(self) -> dict: result: dict = {} result["targets"] = from_list(lambda x: to_class(Target, x), self.targets) return result class Button: id: str iid: UUID layer: str x: int y: int width: int height: int color: int custom_fields: ButtonCustomFields def __init__(self, id: str, iid: UUID, layer: str, x: int, y: int, width: int, height: int, color: int, custom_fields: ButtonCustomFields) -> None: self.id = id self.iid = iid self.layer = layer self.x = x self.y = y self.width = width self.height = height self.color = color self.custom_fields = custom_fields @staticmethod def from_dict(obj: Any) -> 'Button': assert isinstance(obj, dict) id = from_str(obj.get("id")) iid = UUID(obj.get("iid")) layer = from_str(obj.get("layer")) x = from_int(obj.get("x")) y = from_int(obj.get("y")) width = from_int(obj.get("width")) height = from_int(obj.get("height")) color = from_int(obj.get("color")) custom_fields = ButtonCustomFields.from_dict(obj.get("customFields")) return Button(id, iid, layer, x, y, width, height, color, custom_fields) def to_dict(self) -> dict: result: dict = {} result["id"] = from_str(self.id) result["iid"] = str(self.iid) result["layer"] = from_str(self.layer) result["x"] = from_int(self.x) result["y"] = from_int(self.y) result["width"] = from_int(self.width) result["height"] = from_int(self.height) result["color"] = from_int(self.color) result["customFields"] = to_class(ButtonCustomFields, self.custom_fields) return result class DoorCustomFields: locked_with: Optional[str] def __init__(self, locked_with: Optional[str]) -> None: self.locked_with = locked_with @staticmethod def from_dict(obj: Any) -> 'DoorCustomFields': assert isinstance(obj, dict) locked_with = from_union([from_none, from_str], obj.get("lockedWith")) return DoorCustomFields(locked_with) def to_dict(self) -> dict: result: dict = {} result["lockedWith"] = from_union([from_none, from_str], self.locked_with) return result class Door: id: str iid: UUID layer: str x: int y: int width: int height: int color: int custom_fields: DoorCustomFields def __init__(self, id: str, iid: UUID, layer: str, x: int, y: int, width: int, height: int, color: int, custom_fields: DoorCustomFields) -> None: self.id = id self.iid = iid self.layer = layer self.x = x self.y = y self.width = width self.height = height self.color = color self.custom_fields = custom_fields @staticmethod def from_dict(obj: Any) -> 'Door': assert isinstance(obj, dict) id = from_str(obj.get("id")) iid = UUID(obj.get("iid")) layer = from_str(obj.get("layer")) x = from_int(obj.get("x")) y = from_int(obj.get("y")) width = from_int(obj.get("width")) height = from_int(obj.get("height")) color = from_int(obj.get("color")) custom_fields = DoorCustomFields.from_dict(obj.get("customFields")) return Door(id, iid, layer, x, y, width, height, color, custom_fields) def to_dict(self) -> dict: result: dict = {} result["id"] = from_str(self.id) result["iid"] = str(self.iid) result["layer"] = from_str(self.layer) result["x"] = from_int(self.x) result["y"] = from_int(self.y) result["width"] = from_int(self.width) result["height"] = from_int(self.height) result["color"] = from_int(self.color) result["customFields"] = to_class(DoorCustomFields, self.custom_fields) return result class ItemCustomFields: type: str def __init__(self, type: str) -> None: self.type = type @staticmethod def from_dict(obj: Any) -> 'ItemCustomFields': assert isinstance(obj, dict) type = from_str(obj.get("type")) return ItemCustomFields(type) def to_dict(self) -> dict: result: dict = {} result["type"] = from_str(self.type) return result class Item: id: str iid: UUID layer: str x: int y: int width: int height: int color: int custom_fields: ItemCustomFields def __init__(self, id: str, iid: UUID, layer: str, x: int, y: int, width: int, height: int, color: int, custom_fields: ItemCustomFields) -> None: self.id = id self.iid = iid self.layer = layer self.x = x self.y = y self.width = width self.height = height self.color = color self.custom_fields = custom_fields @staticmethod def from_dict(obj: Any) -> 'Item': assert isinstance(obj, dict) id = from_str(obj.get("id")) iid = UUID(obj.get("iid")) layer = from_str(obj.get("layer")) x = from_int(obj.get("x")) y = from_int(obj.get("y")) width = from_int(obj.get("width")) height = from_int(obj.get("height")) color = from_int(obj.get("color")) custom_fields = ItemCustomFields.from_dict(obj.get("customFields")) return Item(id, iid, layer, x, y, width, height, color, custom_fields) def to_dict(self) -> dict: result: dict = {} result["id"] = from_str(self.id) result["iid"] = str(self.iid) result["layer"] = from_str(self.layer) result["x"] = from_int(self.x) result["y"] = from_int(self.y) result["width"] = from_int(self.width) result["height"] = from_int(self.height) result["color"] = from_int(self.color) result["customFields"] = to_class(ItemCustomFields, self.custom_fields) return result class PlayerCustomFields: ammo: int life: int def __init__(self, ammo: int, life: int) -> None: self.ammo = ammo self.life = life @staticmethod def from_dict(obj: Any) -> 'PlayerCustomFields': assert isinstance(obj, dict) ammo = from_int(obj.get("ammo")) life = from_int(obj.get("life")) return PlayerCustomFields(ammo, life) def to_dict(self) -> dict: result: dict = {} result["ammo"] = from_int(self.ammo) result["life"] = from_int(self.life) return result class Player: id: str iid: UUID layer: str x: int y: int width: int height: int color: int custom_fields: PlayerCustomFields def __init__(self, id: str, iid: UUID, layer: str, x: int, y: int, width: int, height: int, color: int, custom_fields: PlayerCustomFields) -> None: self.id = id self.iid = iid self.layer = layer self.x = x self.y = y self.width = width self.height = height self.color = color self.custom_fields = custom_fields @staticmethod def from_dict(obj: Any) -> 'Player': assert isinstance(obj, dict) id = from_str(obj.get("id")) iid = UUID(obj.get("iid")) layer = from_str(obj.get("layer")) x = from_int(obj.get("x")) y = from_int(obj.get("y")) width = from_int(obj.get("width")) height = from_int(obj.get("height")) color = from_int(obj.get("color")) custom_fields = PlayerCustomFields.from_dict(obj.get("customFields")) return Player(id, iid, layer, x, y, width, height, color, custom_fields) def to_dict(self) -> dict: result: dict = {} result["id"] = from_str(self.id) result["iid"] = str(self.iid) result["layer"] = from_str(self.layer) result["x"] = from_int(self.x) result["y"] = from_int(self.y) result["width"] = from_int(self.width) result["height"] = from_int(self.height) result["color"] = from_int(self.color) result["customFields"] = to_class(PlayerCustomFields, self.custom_fields) return result class Entities: door: List[Door] item: List[Item] button: List[Button] player: List[Player] def __init__(self, door: List[Door], item: List[Item], button: List[Button], player: List[Player]) -> None: self.door = door self.item = item self.button = button self.player = player @staticmethod def from_dict(obj: Any) -> 'Entities': assert isinstance(obj, dict) door = from_list(Door.from_dict, obj.get("Door")) item = from_list(Item.from_dict, obj.get("Item")) button = from_list(Button.from_dict, obj.get("Button")) player = from_list(Player.from_dict, obj.get("Player")) return Entities(door, item, button, player) def to_dict(self) -> dict: result: dict = {} result["Door"] = from_list(lambda x: to_class(Door, x), self.door) result["Item"] = from_list(lambda x: to_class(Item, x), self.item) result["Button"] = from_list(lambda x: to_class(Button, x), self.button) result["Player"] = from_list(lambda x: to_class(Player, x), self.player) return result class NeighbourLevel: level_iid: UUID dir: str def __init__(self, level_iid: UUID, dir: str) -> None: self.level_iid = level_iid self.dir = dir @staticmethod def from_dict(obj: Any) -> 'NeighbourLevel': assert isinstance(obj, dict) level_iid = UUID(obj.get("levelIid")) dir = from_str(obj.get("dir")) return NeighbourLevel(level_iid, dir) def to_dict(self) -> dict: result: dict = {} result["levelIid"] = str(self.level_iid) result["dir"] = from_str(self.dir) return result class Welcome: identifier: str unique_identifer: UUID x: int y: int width: int height: int bg_color: str neighbour_levels: List[NeighbourLevel] custom_fields: WelcomeCustomFields layers: List[str] entities: Entities def __init__(self, identifier: str, unique_identifer: UUID, x: int, y: int, width: int, height: int, bg_color: str, neighbour_levels: List[NeighbourLevel], custom_fields: WelcomeCustomFields, layers: List[str], entities: Entities) -> None: self.identifier = identifier self.unique_identifer = unique_identifer self.x = x self.y = y self.width = width self.height = height self.bg_color = bg_color self.neighbour_levels = neighbour_levels self.custom_fields = custom_fields self.layers = layers self.entities = entities @staticmethod def from_dict(obj: Any) -> 'Welcome': assert isinstance(obj, dict) identifier = from_str(obj.get("identifier")) unique_identifer = UUID(obj.get("uniqueIdentifer")) x = from_int(obj.get("x")) y = from_int(obj.get("y")) width = from_int(obj.get("width")) height = from_int(obj.get("height")) bg_color = from_str(obj.get("bgColor")) neighbour_levels = from_list(NeighbourLevel.from_dict, obj.get("neighbourLevels")) custom_fields = WelcomeCustomFields.from_dict(obj.get("customFields")) layers = from_list(from_str, obj.get("layers")) entities = Entities.from_dict(obj.get("entities")) return Welcome(identifier, unique_identifer, x, y, width, height, bg_color, neighbour_levels, custom_fields, layers, entities) def to_dict(self) -> dict: result: dict = {} result["identifier"] = from_str(self.identifier) result["uniqueIdentifer"] = str(self.unique_identifer) result["x"] = from_int(self.x) result["y"] = from_int(self.y) result["width"] = from_int(self.width) result["height"] = from_int(self.height) result["bgColor"] = from_str(self.bg_color) result["neighbourLevels"] = from_list(lambda x: to_class(NeighbourLevel, x), self.neighbour_levels) result["customFields"] = to_class(WelcomeCustomFields, self.custom_fields) result["layers"] = from_list(from_str, self.layers) result["entities"] = to_class(Entities, self.entities) return result def welcome_from_dict(s: Any) -> Welcome: return Welcome.from_dict(s) def welcome_to_dict(x: Welcome) -> Any: return to_class(Welcome, x)