xtap-core-lib 0.5.1

星TAP实验室通用 Rust 基座:跨平台路径/IO/硬件/MCP HTTP 服务/egui 主题与字体(features 按需裁剪)
Documentation
/*
 * shell/mod.rs
 * Project: core_lib
 * Description: 通用 CLI Shell — “三张脸”的统一入口调度
 *
 * 三张脸(见白皮书 §1):
 * - Serve   → 给 AI 用:交给 mcp::McpServer 起 HTTP 服务
 * - Gui     → 给人用:交给 app 的 eframe 窗口(仅 `gui` feature 下存在)
 * - Command → CLI 命令模式,原样透传给 app 自己的命令处理器
 *
 * 本模块只做“argv → Mode”的纯解析,不引入任何额外依赖(不放 feature gate)。
 * 实际起服务 / 开窗口由各 app 在 mcp / ui feature 下自行完成,保持解耦。
 */

mod dispatch;

pub use dispatch::{parse, DEFAULT_HOST, DEFAULT_PORT};

/// 运行模式:由 [`CliShell`] 从 argv 解析得到,app 对其 `match` 分派。
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Mode {
    /// MCP HTTP 服务模式(给 AI 用)。
    Serve { host: String, port: u16 },
    /// GUI 桌面窗口模式(给人用);仅当编译启用 `gui` feature 时存在。
    #[cfg(feature = "gui")]
    Gui,
    /// CLI 命令模式:原始参数透传给 app 自己的命令处理逻辑。
    Command(Vec<String>),
}

/// 轻量 CLI Shell:把进程参数解析成 [`Mode`],由 app 分派执行。
///
/// ```ignore
/// match CliShell::from_env() {
///     Mode::Serve { host, port } => run_mcp(&host, port).await?,
///     #[cfg(feature = "gui")]
///     Mode::Gui => run_gui()?,
///     Mode::Command(argv) => run_cli(&argv)?,
/// }
/// ```
pub struct CliShell;

impl CliShell {
    /// 从 `std::env::args()` 解析(自动跳过 argv[0])。
    pub fn from_env() -> Mode {
        let args: Vec<String> = std::env::args().skip(1).collect();
        parse(&args)
    }

    /// 从给定参数解析(不含 argv[0]),便于测试或自定义入口。
    pub fn from_args(args: &[String]) -> Mode {
        parse(args)
    }
}