| class JSONWrapper: | |
| def __init__(self, baseFileName:str, dataPath:str, key:str|int, value) -> None: | |
| self.baseFileName = baseFileName | |
| self.dataPath = dataPath | |
| self.key = key | |
| self.value = value | |
| def __iter__(self): | |
| self.__index = 0 | |
| if type(self.value) is list: | |
| self.__iterData = [ JSONWrapper(self.baseFileName, f"{self.dataPath}[{i}]", i, item) for i, item in enumerate(self.value)] | |
| elif type(self.value) is dict: | |
| #self.__iterData = [ MetaData.Entry(self.metaData, f"{self.dataPath}/{key}", item) for key, item in self.value.items()] | |
| self.__iterData = list(self.value.keys()) | |
| else: | |
| raise Exception(f"Can't iterate over object of type '{type(self.value)}'") | |
| return self | |
| def __next__(self): | |
| if self.__index < len(self.__iterData): | |
| self.__index += 1 | |
| return self.__iterData[self.__index - 1] | |
| else: | |
| raise StopIteration | |
| def EntryCount(self) -> int: | |
| if type(self.value) is dict: | |
| return len(self.value) | |
| elif type(self.value) is list: | |
| return len(self.value) | |
| return 0 | |
| def HasEntry(self, key) -> bool: | |
| if type(self.value) is dict: | |
| return key in self.value | |
| elif type(self.value) is list: | |
| if type(key) is int: | |
| return key >= 0 and key < len(self.value) | |
| return False | |
| def SetEntry(self, key, value): | |
| if type(self.value) is dict: | |
| self.value[key] = value | |
| elif type(self.value) is list: | |
| if type(key) is int: | |
| if key >= 0 and key < len(self.value): | |
| self.value[key] = value | |
| else: | |
| self.value.append(value) | |
| else: | |
| raise Exception(f"Invalid list index for entry '{self.dataPath}[{key}]' in meta data '{self.baseFileName}'") | |
| else: | |
| raise Exception(f"Can't set entry '{self.dataPath}/{key}' to entry of type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def GetEntry(self, key) -> "JSONWrapper": | |
| if type(self.value) is dict: | |
| if key in self.value: | |
| return JSONWrapper(self.baseFileName, f"{self.dataPath}/{key}", key, self.value[key]) | |
| else: | |
| raise Exception(f"Missing entry '{self.dataPath}/{key}' in meta data '{self.baseFileName}'") | |
| elif type(self.value) is list: | |
| if type(key) is int: | |
| if key >= 0 and key < len(self.value): | |
| return JSONWrapper(self.baseFileName, f"{self.dataPath}[{key}]", key, self.value[key]) | |
| else: | |
| raise Exception(f"List index out of range for entry '{self.dataPath}[{key}]' in meta data '{self.baseFileName}'") | |
| else: | |
| raise Exception(f"Invalid list index for entry '{self.dataPath}[{key}]' in meta data '{self.baseFileName}'") | |
| else: | |
| raise Exception(f"Can't get entry '{self.dataPath}/{key}' from entry of type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsInt(self) -> int: | |
| if type(self.value) is int: | |
| return self.value | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'int' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsFloat(self) -> float: | |
| if type(self.value) is float: | |
| return self.value | |
| elif type(self.value) is int: | |
| return float(self.value) | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'float' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsString(self) -> str: | |
| if type(self.value) is str: | |
| return self.value | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'string' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsBool(self) -> bool: | |
| if type(self.value) is bool: | |
| return self.value | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'bool' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsList(self) -> list: | |
| if type(self.value) is list: | |
| return self.value | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'list' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsDict(self) -> dict: | |
| if type(self.value) is dict: | |
| return self.value | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'dict' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") | |
| def AsParameter(self) -> float | int | str | bool: | |
| if type(self.value) in [float, int, str, bool]: | |
| return self.value | |
| else: | |
| raise Exception(f"Value '{self.dataPath}' must have type 'float' or 'int' or 'str' or 'bool' but found type '{type(self.value)}' in meta data '{self.baseFileName}'") |