File size: 2,360 Bytes
a1efcaf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""CLI entry point for DEX Studio.

Usage::

    dex-studio                     # Launch with defaults
    dex-studio --url http://...:8000
    dex-studio --config path/to/config.yaml
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from dex_studio.config import StudioConfig, load_config


def _build_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(
        prog="dex-studio",
        description="DEX Studio — local control plane for DataEngineX/DEX",
    )
    parser.add_argument(
        "--url",
        default=None,
        help="DEX engine API URL (default: http://localhost:8000)",
    )
    parser.add_argument(
        "--token",
        default=None,
        help="Bearer token for authenticated DEX engine",
    )
    parser.add_argument(
        "--config",
        default=None,
        type=Path,
        help="Path to a YAML config file",
    )
    parser.add_argument(
        "--theme",
        choices=["dark", "light"],
        default=None,
        help="UI theme (default: dark)",
    )
    parser.add_argument(
        "--no-native",
        action="store_true",
        help="Open in browser instead of a native window",
    )
    parser.add_argument(
        "--version",
        action="store_true",
        help="Print version and exit",
    )
    return parser


def main(argv: list[str] | None = None) -> None:
    """CLI entry point."""
    parser = _build_parser()
    args = parser.parse_args(argv)

    if args.version:
        from dex_studio import __version__

        print(f"dex-studio {__version__}")  # noqa: T201
        sys.exit(0)

    # Load base config (file + env)
    cfg = load_config(path=args.config)

    # Apply CLI overrides
    overrides: dict[str, object] = {}
    if args.url:
        overrides["api_url"] = args.url
    if args.token:
        overrides["api_token"] = args.token
    if args.theme:
        overrides["theme"] = args.theme
    if args.no_native:
        overrides["native_mode"] = False

    if overrides:
        # Re-create with overrides (frozen dataclass)
        from dataclasses import asdict

        merged = {**asdict(cfg), **overrides}
        cfg = StudioConfig(**merged)

    # Launch the NiceGUI app
    from dex_studio.app import start

    start(config=cfg)


if __name__ == "__main__":
    main()