| 70 | |
| 71 | |
| 72 | class MetaDatabase(object): |
| 73 | def __init__(self): |
| 74 | self.records = [] |
| 75 | self.enums = [] |
| 76 | self.name_to_record = {} |
| 77 | self.name_to_enum = {} |
| 78 | self.functions = [] |
| 79 | self.includes = set() |
| 80 | |
| 81 | def add_include(self, path): |
| 82 | self.includes.add(os.path.normpath(path).replace(os.sep, "/")) |
| 83 | |
| 84 | def set_names(self, type, name): |
| 85 | type.name = name |
| 86 | type.id = name.replace("::", "_") |
| 87 | type.luaName = name.replace("::", ".") |
| 88 | var = str.rsplit(name, "::", 1) |
| 89 | type.short_name = var[-1] |
| 90 | if len(var) > 1: |
| 91 | type.namespace = var[0] |
| 92 | |
| 93 | def load_meta_file(self, file, add): |
| 94 | try: |
| 95 | meta = json.load(open(file, encoding='utf-8'), object_hook=lambda d: SimpleNamespace(**d)) |
| 96 | except json.decoder.JSONDecodeError as e: |
| 97 | print(e) |
| 98 | abort(file) |
| 99 | for name, record in vars(meta.records).items(): |
| 100 | self.set_names(record, name) |
| 101 | if add: |
| 102 | self.records.append(record) |
| 103 | self.add_include(record.fileName) |
| 104 | self.name_to_record[record.name] = record |
| 105 | for name, enum in vars(meta.enums).items(): |
| 106 | self.set_names(enum, name) |
| 107 | if add: |
| 108 | self.enums.append(enum) |
| 109 | self.add_include(enum.fileName) |
| 110 | self.name_to_enum[enum.name] = enum |
| 111 | for function in meta.functions: |
| 112 | self.add_include(function.fileName) |
| 113 | self.functions.append(function) |
| 114 | |
| 115 | def render(self, filename, **context): |
| 116 | try: |
| 117 | template = Template( |
| 118 | open(filename, "rb").read(), |
| 119 | filename=filename, |
| 120 | input_encoding="utf8", |
| 121 | strict_undefined=True, |
| 122 | ) |
| 123 | return template.render(**context) |
| 124 | except Exception: |
| 125 | # Uncomment to see a traceback in generated Python code: |
| 126 | # raise |
| 127 | abort(exceptions.text_error_template().render()) |
| 128 | |
| 129 | def generate_forward(self): |