(lines)
| 62 | |
| 63 | |
| 64 | def parse_settings(lines): |
| 65 | def parse_value(value): |
| 66 | value = value.lstrip() |
| 67 | value = value.replace("SERVERINFO_LEVEL_MIN", "0") |
| 68 | value = value.replace("SERVERINFO_LEVEL_MAX", "2") |
| 69 | value = value.replace("SERVER_MAX_CLIENTS", "64") |
| 70 | value = value.replace("MAX_CLIENTS", "128") |
| 71 | try: |
| 72 | return int(value, base=16) if value.startswith(("0x", "0X")) else int(value) |
| 73 | except Exception as e: |
| 74 | raise RuntimeError("Failed to parse setting value: {value}") from e |
| 75 | |
| 76 | names = {} |
| 77 | parsed_settings = [] |
| 78 | for line in lines: |
| 79 | args = re.match(r"^MACRO_CONFIG_(.*?)\((.*)\)", line) |
| 80 | if args is None: |
| 81 | continue |
| 82 | |
| 83 | if args[1] == "STR": |
| 84 | parsed = parse_arguments(args[2], num=6, name="string setting") |
| 85 | flags = parse_flags(parsed[4], f"string setting '{parsed[1]}'") |
| 86 | setting = {"type": "string", "flags": flags, "name": parsed[1], "description": parsed[5], "default": f'"{parsed[3]}"'} |
| 87 | elif args[1] == "INT": |
| 88 | parsed = parse_arguments(args[2], num=7, name="int setting") |
| 89 | flags = parse_flags(parsed[5], f"int setting '{parsed[1]}'") |
| 90 | setting = {"type": "int", "flags": flags, "name": parsed[1], "description": parsed[6], "default": parse_value(parsed[2]), "min": parse_value(parsed[3]), "max": parse_value(parsed[4])} |
| 91 | elif args[1] == "COL": |
| 92 | parsed = parse_arguments(args[2], num=5, name="color setting") |
| 93 | flags = parse_flags(parsed[3], f"color setting '{parsed[1]}'") |
| 94 | setting = {"type": "color", "flags": flags, "name": parsed[1], "description": parsed[4], "default": parse_value(parsed[2])} |
| 95 | else: |
| 96 | raise RuntimeError(f"Failed to parse settings type: {args[1]}") |
| 97 | |
| 98 | # Filter duplicates because config_variables.h contains some definitions multiple times with #ifdef |
| 99 | if setting["name"] in names: |
| 100 | parsed_settings[names[setting["name"]]] = setting |
| 101 | else: |
| 102 | names[setting["name"]] = len(parsed_settings) |
| 103 | parsed_settings.append(setting) |
| 104 | |
| 105 | parsed_settings.sort(key=lambda setting: setting["name"]) |
| 106 | return parsed_settings |
| 107 | |
| 108 | |
| 109 | def parse_tunings(lines): |
no test coverage detected