import re
import sys
from pathlib import Path
FORBIDDEN = [
(r"\bstd::fs\b", "std::fs"),
(r"\bstd::net\b", "std::net"),
(r"\bstd::process\b", "std::process"),
(r"\btokio::", "tokio::"),
(r"\breqwest\b", "reqwest"),
(r"\bSystemTime::now\b", "SystemTime::now"),
(r"\bInstant::now\b", "Instant::now"),
]
ROOT = Path("src/domain")
def production_prefix(text: str) -> str:
idx = text.find("#[cfg(test)]")
return text if idx == -1 else text[:idx]
def main() -> int:
violations = []
files = sorted(ROOT.rglob("*.rs"))
for path in files:
prod = production_prefix(path.read_text(encoding="utf-8"))
for lineno, line in enumerate(prod.splitlines(), 1):
stripped = line.strip()
if stripped.startswith("//"):
continue
for pattern, name in FORBIDDEN:
if re.search(pattern, line):
violations.append(f" {path}:{lineno}: `{name}` -> {stripped}")
if violations:
print("domain/ purity violations (move I/O + the wall clock to the effect layer):")
print("\n".join(violations))
return 1
print(f"domain/ purity OK ({len(files)} files scanned)")
return 0
if __name__ == "__main__":
sys.exit(main())