subx_cli/cli/
mod.rs

1//! SubX CLI 模組
2
3mod cache_args;
4mod config_args;
5mod convert_args;
6mod detect_encoding_args;
7mod generate_completion_args;
8mod match_args;
9mod sync_args;
10mod table;
11mod ui;
12
13pub use cache_args::{CacheAction, CacheArgs};
14use clap::{Parser, Subcommand};
15pub use config_args::{ConfigAction, ConfigArgs};
16pub use convert_args::{ConvertArgs, OutputSubtitleFormat};
17pub use detect_encoding_args::DetectEncodingArgs;
18pub use generate_completion_args::GenerateCompletionArgs;
19pub use match_args::MatchArgs;
20pub use sync_args::{SyncArgs, SyncMethod};
21pub use ui::{
22    create_progress_bar, display_ai_usage, display_match_results, print_error, print_success,
23    print_warning,
24};
25
26/// SubX CLI 主體
27#[derive(Parser, Debug)]
28#[command(name = "subx-cli")]
29#[command(about = "智慧字幕處理 CLI 工具")]
30#[command(version = env!("CARGO_PKG_VERSION"))]
31pub struct Cli {
32    #[command(subcommand)]
33    pub command: Commands,
34}
35
36/// 子命令選項
37#[derive(Subcommand, Debug)]
38pub enum Commands {
39    /// AI 匹配重命名字幕檔案
40    Match(MatchArgs),
41    /// 轉換字幕格式
42    Convert(ConvertArgs),
43    /// 檔案編碼檢測
44    DetectEncoding(DetectEncodingArgs),
45    /// 時間軸同步校正
46    Sync(SyncArgs),
47    /// 配置管理
48    Config(ConfigArgs),
49    /// 產生 shell completion script
50    GenerateCompletion(GenerateCompletionArgs),
51    /// Dry-run 快取管理
52    Cache(CacheArgs),
53}
54
55/// 執行 CLI
56pub async fn run() -> crate::Result<()> {
57    let cli = Cli::parse();
58
59    match cli.command {
60        Commands::Match(args) => {
61            crate::commands::match_command::execute(args).await?;
62        }
63        Commands::Convert(args) => {
64            crate::commands::convert_command::execute(args).await?;
65        }
66        Commands::Sync(args) => {
67            crate::commands::sync_command::execute(args).await?;
68        }
69        Commands::Config(args) => {
70            crate::commands::config_command::execute(args).await?;
71        }
72        Commands::GenerateCompletion(args) => {
73            let mut cmd = <Cli as clap::CommandFactory>::command();
74            let cmd_name = cmd.get_name().to_string();
75            let mut stdout = std::io::stdout();
76            clap_complete::generate(args.shell, &mut cmd, cmd_name, &mut stdout);
77        }
78        Commands::Cache(args) => {
79            crate::commands::cache_command::execute(args).await?;
80        }
81        Commands::DetectEncoding(args) => {
82            crate::commands::detect_encoding_command::detect_encoding_command(
83                &args.file_paths,
84                args.verbose,
85            )?;
86        }
87    }
88    Ok(())
89}