aboutsummaryrefslogtreecommitdiff
path: root/codegen/lib/code/inventory.py
blob: caab57f2949197ecf173f6f3a90809a469b8f61a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from lib.utils import padded_hex, to_snake_case, to_camel_case, get_dir_location
from lib.code.utils import burger_type_to_rust_type, write_packet_file
from lib.mappings import Mappings
from typing import Any, Optional
import os
import re

# The directory where declare_menus! {} is done
inventory_menus_dir = get_dir_location(f'../azalea-inventory/src/lib.rs')


def update_menus(initial_menu_entries: dict[str, Any]):
    # new_menus is a dict of { menu_id: { "protocol_id": protocol_id } }
    # so convert that into an array where the protocol id is the index and the
    # values are enum variant names
    new_menus: list[str] = [''] * len(initial_menu_entries)
    for menu_id, menu in initial_menu_entries.items():
        new_menus[menu['protocol_id']] = menu_name_to_enum_name(menu_id)

    new_menus.insert(0, 'Player')

    with open(inventory_menus_dir, 'r') as f:
        menus_rs = f.read().splitlines()

        start_line_index = 0

        current_menus = []
        in_the_macro = False
        for i, line in enumerate(menus_rs):
            if line.startswith('declare_menus!'):
                in_the_macro = True
                start_line_index = i
            if in_the_macro:
                if line.startswith('    ') and line.endswith('{'):
                    # get the variant name for this menu
                    current_menu = line[:-1].strip()
                    current_menus.append(current_menu)

        print('current_menus', current_menus)
        print('new_menus', new_menus)

        # now we have the current menus, so compare that with the expected
        # menus and update the file if needed
        if current_menus != new_menus:
            # ok so insert the new menus with todo!() for the body
            current_menus_list_index = 0
            new_menus_list_index = 0
            insert_line_index = start_line_index + 1
            # figure out what menus need to be placed
            while True:
                # if the values at the indexes are the same, add to both and don't do anything
                if (
                    current_menus_list_index < len(current_menus)
                    and new_menus_list_index < len(new_menus)
                    and current_menus[current_menus_list_index] == new_menus[new_menus_list_index]
                ):
                    current_menus_list_index += 1
                    new_menus_list_index += 1
                    # increase insert_line_index until we get a line that starts with }
                    while not menus_rs[insert_line_index].strip().startswith('}'):
                        insert_line_index += 1
                    insert_line_index += 1
                    # print('same', current_menus_list_index,
                    #       new_menus_list_index, insert_line_index)
                # something was added to new_menus but not current_menus
                elif new_menus_list_index < len(new_menus) and new_menus[new_menus_list_index] not in current_menus:
                    # insert the new menu
                    menus_rs.insert(
                        insert_line_index, f'    {new_menus[new_menus_list_index]} {{\n        todo!()\n    }},')
                    insert_line_index += 1
                    new_menus_list_index += 1
                    print('added', current_menus_list_index,
                          new_menus_list_index, insert_line_index)
                # something was removed from new_menus but is still in current_menus
                elif current_menus_list_index < len(current_menus) and current_menus[current_menus_list_index] not in new_menus:
                    # remove the current menu
                    while not menus_rs[insert_line_index].strip().startswith('}'):
                        menus_rs.pop(insert_line_index)
                    menus_rs.pop(insert_line_index)
                    current_menus_list_index += 1
                    print('removed', current_menus_list_index,
                          new_menus_list_index, insert_line_index)

                # if current_menus_list_index overflowed, then add the rest of the new menus
                elif current_menus_list_index >= len(current_menus):
                    for i in range(new_menus_list_index, len(new_menus)):
                        menus_rs.insert(
                            insert_line_index, f'    {new_menus[i]} {{\n        todo!()\n    }},')
                        insert_line_index += 1
                    print('current_menus_list_index overflowed', current_menus_list_index,
                          new_menus_list_index, insert_line_index)
                    break
                # if new_menus_list_index overflowed, then remove the rest of the current menus
                elif new_menus_list_index >= len(new_menus):
                    for _ in range(current_menus_list_index, len(current_menus)):
                        while not menus_rs[insert_line_index].strip().startswith('}'):
                            menus_rs.pop(insert_line_index)
                        menus_rs.pop(insert_line_index)
                        # current_menus_list_index += 1
                    print('new_menus_list_index overflowed', current_menus_list_index,
                          new_menus_list_index, insert_line_index)
                    break
    with open(inventory_menus_dir, 'w') as f:
        f.write('\n'.join(menus_rs))


def menu_name_to_enum_name(menu_name: str) -> str:
    return to_camel_case(menu_name.split(':')[-1])