import os import re import yaml # Regular expression to match .get("a:b:c", x) pattern = re.compile(r'\.get<([^>]+)>\("([^"]+)",\s*([^);]+)\)') def parse_value(value, type_hint): """Converts values to appropriate types.""" value = value.strip() # Handle common types if type_hint in {"int", "long"}: return int(value) elif type_hint in {"float", "double"}: return float(value) elif type_hint == "bool": return value.lower() in {"true", "1"} elif value.startswith('"') and value.endswith('"'): return value.strip('"') # Remove quotes for string literals elif value.startswith("'") and value.endswith("'"): return value.strip("'") # Remove single quotes return value # Return as-is if unsure def insert_into_dict(hierarchy_dict, keys, value, type_hint): """Recursively inserts values into a nested dictionary.""" key = keys.pop(0) if not keys: # If last key, store value hierarchy_dict[key] = parse_value(value, type_hint) else: if key not in hierarchy_dict: hierarchy_dict[key] = {} insert_into_dict(hierarchy_dict[key], keys, value, type_hint) def scan_files(directory): """Scans all .cpp, .h, .c, and .hpp files in a directory recursively.""" hierarchy_dict = {} for root, _, files in os.walk(directory): for file in files: if file.endswith(('.cpp', '.h', '.c', '.hpp')): file_path = os.path.join(root, file) with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: for line in f: match = pattern.search(line) if match: type_hint, hierarchy, value = match.groups() keys = hierarchy.split(":") insert_into_dict(hierarchy_dict, keys, value, type_hint) return hierarchy_dict def save_yaml(data, output_file): """Saves the nested dictionary to a YAML file.""" with open(output_file, 'w', encoding='utf-8') as f: yaml.dump(data, f, default_flow_style=False, sort_keys=False, indent=4) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Generate a YAML file with default configuration values.") parser.add_argument("directory", help="Directory to scan for .cpp, .h, .c, and .hpp files.") parser.add_argument("-o", "--output", help="Output file name.", default="defaults.yaml") args = parser.parse_args() extracted_data = scan_files(args.directory) save_yaml(extracted_data, args.output) print(f"✅ YAML file generated: {args.output}")