xtap_core_lib/shell/mod.rs
1/*
2 * shell/mod.rs
3 * Project: core_lib
4 * Description: 通用 CLI Shell — “三张脸”的统一入口调度
5 *
6 * 三张脸(见白皮书 §1):
7 * - Serve → 给 AI 用:交给 mcp::McpServer 起 HTTP 服务
8 * - Gui → 给人用:交给 app 的 eframe 窗口(仅 `gui` feature 下存在)
9 * - Command → CLI 命令模式,原样透传给 app 自己的命令处理器
10 *
11 * 本模块只做“argv → Mode”的纯解析,不引入任何额外依赖(不放 feature gate)。
12 * 实际起服务 / 开窗口由各 app 在 mcp / ui feature 下自行完成,保持解耦。
13 */
14
15mod dispatch;
16
17pub use dispatch::{parse, DEFAULT_HOST, DEFAULT_PORT};
18
19/// 运行模式:由 [`CliShell`] 从 argv 解析得到,app 对其 `match` 分派。
20#[derive(Debug, Clone, PartialEq, Eq)]
21pub enum Mode {
22 /// MCP HTTP 服务模式(给 AI 用)。
23 Serve { host: String, port: u16 },
24 /// GUI 桌面窗口模式(给人用);仅当编译启用 `gui` feature 时存在。
25 #[cfg(feature = "gui")]
26 Gui,
27 /// CLI 命令模式:原始参数透传给 app 自己的命令处理逻辑。
28 Command(Vec<String>),
29}
30
31/// 轻量 CLI Shell:把进程参数解析成 [`Mode`],由 app 分派执行。
32///
33/// ```ignore
34/// match CliShell::from_env() {
35/// Mode::Serve { host, port } => run_mcp(&host, port).await?,
36/// #[cfg(feature = "gui")]
37/// Mode::Gui => run_gui()?,
38/// Mode::Command(argv) => run_cli(&argv)?,
39/// }
40/// ```
41pub struct CliShell;
42
43impl CliShell {
44 /// 从 `std::env::args()` 解析(自动跳过 argv[0])。
45 pub fn from_env() -> Mode {
46 let args: Vec<String> = std::env::args().skip(1).collect();
47 parse(&args)
48 }
49
50 /// 从给定参数解析(不含 argv[0]),便于测试或自定义入口。
51 pub fn from_args(args: &[String]) -> Mode {
52 parse(args)
53 }
54}