aboutsummaryrefslogtreecommitdiff
path: root/codegen/genitemcomponents.py
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2025-03-25 11:17:39 -0500
committerGitHub <noreply@github.com>2025-03-25 11:17:39 -0500
commitef357fdf3667f3ded03203fc0f7cdec48a01ad8f (patch)
tree6e7429c62a22fec1988278f63554c93bdd905a5d /codegen/genitemcomponents.py
parent8af265e48bf9f3d5263c074d034770e4216bb3f3 (diff)
downloadazalea-drasl-ef357fdf3667f3ded03203fc0f7cdec48a01ad8f.tar.xz
1.21.5 (#198)
* 25w02a * move item_components codegen to a different module * remove outdated test * 25w03a * start updating to 24w09b * 1.21.5-pre2 * fix broken packets * 1.21.5-rc2 * merge main * delete unused acket_handling * 1.21.5
Diffstat (limited to 'codegen/genitemcomponents.py')
-rw-r--r--codegen/genitemcomponents.py165
1 files changed, 2 insertions, 163 deletions
diff --git a/codegen/genitemcomponents.py b/codegen/genitemcomponents.py
index 625af847..b0002ae2 100644
--- a/codegen/genitemcomponents.py
+++ b/codegen/genitemcomponents.py
@@ -1,167 +1,6 @@
-import lib.code.inventory
-import lib.code.registry
+import lib.code.item_components
import lib.code.version
-import lib.code.packet
-import lib.code.utils
-import lib.code.tags
-import lib.download
-import lib.extract
-import lib.utils
-
-ITEM_COMPONENTS_DIR = 'azalea-inventory/src/components.rs'
-
-def generate(version_id: str):
- expected_variants = get_expected_variants(version_id)
- actual_variants = get_actual_variants()
-
- new_variants = []
- removed_variants = []
-
- for variant in expected_variants:
- if variant not in actual_variants:
- new_variants.append(variant)
- for variant in actual_variants:
- if variant not in expected_variants:
- removed_variants.append(variant)
-
- print('New variants:')
- for variant in new_variants:
- print('-', variant)
- print()
- print('Removed variants:')
- for variant in removed_variants:
- print('-', variant)
- print()
-
- for variant in removed_variants:
- print(f'Removing {variant}...')
- remove_variant(variant)
- for variant in new_variants:
- print(f'Adding {variant}...')
- add_variant(variant)
-
- lib.code.utils.fmt()
-
- print('Done!')
-
-def get_expected_variants(version_id: str):
- expected_variants = []
- registries = lib.extract.get_registries_report(version_id)
-
- registry = registries['minecraft:data_component_type']
- registry_entries = sorted(
- registry['entries'].items(), key=lambda x: x[1]['protocol_id'])
- for variant_name, _variant in registry_entries:
- variant_struct_name = lib.utils.to_camel_case(variant_name.split(':')[-1])
- expected_variants.append(variant_struct_name)
-
- return expected_variants
-
-def get_actual_variants():
- actual_variants = []
- with open(ITEM_COMPONENTS_DIR, 'r') as f:
- code = f.read().split('\n')
-
- in_match = False
- for line in code:
- if in_match:
- if line == ' })':
- break
- variant_line_prefix = ' DataComponentKind::'
- if line.startswith(variant_line_prefix):
- variant = line[len(variant_line_prefix):].split(' ', 1)[0]
- actual_variants.append(variant)
- elif line == ' Ok(match kind {':
- in_match = True
-
- return actual_variants
-
-def remove_variant(variant: str):
- with open(ITEM_COMPONENTS_DIR, 'r') as f:
- code = f.read().split('\n')
-
- first_line_with_variant = None
- line_after_variant = None
-
- in_match = False
- for i, line in enumerate(list(code)):
- if in_match:
- if line == ' })':
- line_after_variant = i
- break
- variant_line_prefix = ' DataComponentKind::'
- if line.startswith(variant_line_prefix):
- if first_line_with_variant is not None:
- line_after_variant = i
- break
- variant_name = line[len(variant_line_prefix):].split(' ', 1)[0]
- if variant_name == variant:
- first_line_with_variant = i
- elif line == ' Ok(match kind {':
- in_match = True
-
- if first_line_with_variant is None:
- raise ValueError(f'Variant {variant} not found')
- if line_after_variant is None:
- raise ValueError(f'Couldn\'t find end of variant {variant}')
-
- code = code[:first_line_with_variant] + code[line_after_variant:]
-
- # now remove the struct
- line_before_struct = None # this is the #[derive] line
- line_after_struct = None # impl DataComponent for ... {\n...\n}
- for i, line in enumerate(list(code)):
- if line == f'pub struct {variant} {{' or line == f'pub struct {variant};':
- line_before_struct = i - 1
- elif line == f'impl DataComponent for {variant} {{':
- line_after_struct = i + 3
- break
- if line_before_struct is None:
- raise ValueError(f'Couldn\'t find struct {variant}')
- if line_after_struct is None:
- raise ValueError(f'Couldn\'t find impl DataComponent for {variant}')
-
- code = code[:line_before_struct] + code[line_after_struct:]
-
- with open(ITEM_COMPONENTS_DIR, 'w') as f:
- f.write('\n'.join(code))
-
-def add_variant(variant: str):
- with open(ITEM_COMPONENTS_DIR, 'r') as f:
- code = f.read().split('\n')
-
- in_match = False
- last_line_in_match = None
- for i, line in enumerate(list(code)):
- if in_match:
- if line == ' })':
- last_line_in_match = i
- break
- elif line == ' Ok(match kind {':
- in_match = True
-
- if last_line_in_match is None:
- raise ValueError('Couldn\'t find end of match')
-
- code = code[:last_line_in_match] + [
- f' DataComponentKind::{variant} => Box::new({variant}::azalea_read(buf)?),',
- ] + code[last_line_in_match:]
-
- # now insert the struct
- code.append('')
- code.append('#[derive(Clone, PartialEq, AzBuf)]')
- code.append(f'pub struct {variant} {{')
- code.append(' pub todo: todo!(), // see DataComponents.java')
- code.append('}')
- code.append(f'impl DataComponent for {variant} {{')
- code.append(f' const KIND: DataComponentKind = DataComponentKind::{variant};')
- code.append('}')
-
- with open(ITEM_COMPONENTS_DIR, 'w') as f:
- f.write('\n'.join(code))
-
- lib.code.utils.fmt()
if __name__ == '__main__':
version_id = lib.code.version.get_version_id()
- generate(version_id)
+ lib.code.item_components.generate(version_id)