-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsplit_gip.py
More file actions
118 lines (102 loc) · 3.86 KB
/
Copy pathsplit_gip.py
File metadata and controls
118 lines (102 loc) · 3.86 KB
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
import os
import re
def main():
with open("src/gip_dispatch.zig", "r") as f:
lines = f.readlines()
def find_func(name):
in_func = False
start = -1
end = -1
brace_count = 0
for i, line in enumerate(lines):
if line.startswith(f"fn {name}(") or line.startswith(f"pub fn {name}("):
in_func = True
start = i
if in_func:
brace_count += line.count('{')
brace_count -= line.count('}')
if brace_count == 0:
end = i
return start, end
return -1, -1
def move_domain(domain_name, func_names):
funcs_code = []
ranges_to_delete = []
for fn in func_names:
s, e = find_func(fn)
if s != -1:
# change to pub fn
lines[s] = lines[s].replace(f"fn {fn}", f"pub fn {fn}")
funcs_code.extend(lines[s:e+1])
funcs_code.append("\n")
ranges_to_delete.append((s, e))
if not funcs_code:
return
header = """const std = @import("std");
const core = @import("../ghost_core.zig");
const sys = @import("../sys.zig");
const gip = @import("../gip.zig");
const ghost_state = @import("../ghost_state.zig");
const config = @import("../config.zig");
const knowledge_pack_store = @import("../knowledge_pack_store.zig");
const verifier = @import("../verifier.zig");
const artifact_autopsy = @import("../artifact_autopsy.zig");
// Add any missing imports based on compiler errors
"""
os.makedirs("src/gip", exist_ok=True)
with open(f"src/gip/routes_{domain_name}.zig", "w") as out:
out.write(header + "\n" + "".join(funcs_code))
return ranges_to_delete
domains = {
"artifacts": [
"dispatchArtifactRead",
"dispatchArtifactList",
"dispatchArtifactPolicyDescribe",
"dispatchArtifactPatchPropose",
"dispatchArtifactAutopsyInspect"
],
"learning": [
"dispatchLearningReview",
"dispatchLearningStatus",
"dispatchLearningLoopPlan"
],
"verification": [
"dispatchVerifierList",
"dispatchVerifierCandidateExecutionList",
"dispatchVerifierCandidateExecutionGet",
"dispatchVerifierCandidateProposeFromLearningPlan",
"dispatchVerifierCandidateList",
"dispatchVerifierCandidateReview",
"dispatchVerifierCandidateExecute"
]
}
all_ranges = []
for domain, funcs in domains.items():
ranges = move_domain(domain, funcs)
if ranges:
all_ranges.extend(ranges)
# Remove the functions from the original file
# Sort in reverse to not mess up indices
all_ranges.sort(key=lambda x: x[0], reverse=True)
for s, e in all_ranges:
del lines[s:e+1]
# Insert imports
imports = """const routes_artifacts = @import("gip/routes_artifacts.zig");
const routes_learning = @import("gip/routes_learning.zig");
const routes_verification = @import("gip/routes_verification.zig");
"""
for i, line in enumerate(lines):
if line.startswith("const std ="):
lines.insert(i + 1, imports)
break
# Update switch statement to call the new modules
# E.g. dispatchArtifactRead(allocator, request_body) -> routes_artifacts.dispatchArtifactRead(...)
for i, line in enumerate(lines):
for domain, funcs in domains.items():
for fn in funcs:
if f"{fn}(" in line and "=>" in line:
lines[i] = line.replace(f"{fn}(", f"routes_{domain}.{fn}(")
with open("src/gip_dispatch.zig", "w") as f:
f.writelines(lines)
if __name__ == "__main__":
main()