1mod 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#[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#[derive(Subcommand, Debug)]
38pub enum Commands {
39 Match(MatchArgs),
41 Convert(ConvertArgs),
43 DetectEncoding(DetectEncodingArgs),
45 Sync(SyncArgs),
47 Config(ConfigArgs),
49 GenerateCompletion(GenerateCompletionArgs),
51 Cache(CacheArgs),
53}
54
55pub 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}