"""CLI entry point: python -m dfgraph path/to/file.dfasm [--port 8420]""" import argparse import sys import threading import webbrowser import time from pathlib import Path import uvicorn from dfgraph.server import create_app def main() -> None: parser = argparse.ArgumentParser( prog="dfgraph", description="Visualise a dfasm dataflow program as an interactive graph.", ) parser.add_argument( "file", type=Path, help="Path to the .dfasm source file to visualise", ) parser.add_argument( "--port", type=int, default=8420, help="Port for the web server (default: 8420)", ) args = parser.parse_args() if not args.file.exists(): print(f"Error: file not found: {args.file}", file=sys.stderr) sys.exit(1) if not args.file.suffix == ".dfasm": print(f"Warning: expected .dfasm file, got: {args.file.suffix}", file=sys.stderr) app = create_app(args.file.resolve()) def open_browser(): time.sleep(1) webbrowser.open(f"http://127.0.0.1:{args.port}", new=2) thread = threading.Thread(target=open_browser, daemon=True) thread.start() uvicorn.run(app, host="127.0.0.1", port=args.port, log_level="info") if __name__ == "__main__": main()