aboutsummaryrefslogtreecommitdiff
path: root/codegen/lib/code/inventory.py
blob: 7acb269d8091a05145a5437cbd83235eaff80656 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from typing import Any
from lib.utils import identifier_to_path, to_camel_case, get_dir_location

# The directory where declare_menus! {} is done
inventory_menus_dir = get_dir_location("../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(identifier_to_path(menu_name))