herolib_python/_archive/openrpc/parser/cleaner.py
2025-08-05 15:15:36 +02:00

89 lines
3.0 KiB
Python

import re
import os
# remoces pub, mut, non needed code, ...
def cleaner(code: str):
lines = code.split("\n")
processed_lines = []
in_function = False
in_struct_or_enum = False
for line in lines:
line = line.replace("\t", " ")
stripped_line = line.strip()
# Skip lines starting with 'pub mut:'
if re.match(r"^\s*pub\s*(\s+mut\s*)?:", stripped_line):
continue
# Remove 'pub ' at the start of struct and function lines
if stripped_line.startswith("pub "):
line = line.lstrip()[4:] # Remove leading spaces and 'pub '
# Check if we're entering or exiting a struct or enum
if re.match(r"(struct|enum)\s+\w+\s*{", stripped_line):
in_struct_or_enum = True
processed_lines.append(line)
elif in_struct_or_enum and "}" in stripped_line:
in_struct_or_enum = False
processed_lines.append(line)
elif in_struct_or_enum:
# Ensure consistent indentation within structs and enums
processed_lines.append(line)
else:
# Handle function declarations
if "fn " in stripped_line:
if "{" in stripped_line:
# Function declaration and opening brace on the same line
in_function = True
processed_lines.append(line)
else:
return Exception(f"accolade needs to be in fn line.\n{line}")
elif in_function:
if stripped_line == "}":
# Closing brace of the function
in_function = False
processed_lines.append("}")
# Skip all other lines inside the function
else:
processed_lines.append(line)
return "\n".join(processed_lines)
def load(path: str) -> str:
# walk over directory find all .v files, recursive
# ignore all imports (import at start of line)
# ignore all module ... (module at start of line)
path = os.path.expanduser(path)
if not os.path.exists(path):
raise FileNotFoundError(f"The path '{path}' does not exist.")
all_code = []
# Walk over directory recursively
for root, _, files in os.walk(path):
for file in files:
if file.endswith(".v"):
file_path = os.path.join(root, file)
with open(file_path, "r") as f:
lines = f.readlines()
# Filter out import and module lines
filtered_lines = [
line
for line in lines
if not line.strip().startswith(("import", "module"))
]
all_code.append("".join(filtered_lines))
return "\n\n".join(all_code)
if __name__ == "__main__":
# from heroserver.openrpc.parser.example import load_example
code = load("~/code/git.threefold.info/projectmycelium/hero_server/lib/openrpclib/parser/examples")
# Parse the code
code = cleaner(code)
print(code)