mod cache_args;
mod config_args;
mod convert_args;
mod detect_encoding_args;
mod generate_completion_args;
mod input_handler;
mod match_args;
pub mod sync_args;
pub mod table;
pub mod ui;
pub use cache_args::{
ApplyArgs, CacheAction, CacheArgs, ClearArgs, ClearType, RollbackArgs, StatusArgs,
};
use clap::{Parser, Subcommand};
pub use config_args::{ConfigAction, ConfigArgs};
pub use convert_args::{ConvertArgs, OutputSubtitleFormat};
pub use detect_encoding_args::DetectEncodingArgs;
pub use generate_completion_args::GenerateCompletionArgs;
pub use input_handler::{CollectedFiles, InputPathHandler};
pub use match_args::MatchArgs;
pub use sync_args::{SyncArgs, SyncMethod, SyncMethodArg, SyncMode};
pub use ui::{
create_progress_bar, display_ai_usage, display_match_results, print_error, print_success,
print_warning,
};
#[derive(Parser, Debug)]
#[command(name = "subx-cli")]
#[command(about = "Intelligent subtitle processing CLI tool")]
#[command(version = env!("CARGO_PKG_VERSION"))]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Match(MatchArgs),
Convert(ConvertArgs),
DetectEncoding(DetectEncodingArgs),
Sync(SyncArgs),
Config(ConfigArgs),
GenerateCompletion(GenerateCompletionArgs),
Cache(CacheArgs),
}
pub async fn run() -> crate::Result<()> {
let config_service = std::sync::Arc::new(crate::config::ProductionConfigService::new()?);
run_with_config(config_service.as_ref()).await
}
pub async fn run_with_config(
config_service: &dyn crate::config::ConfigService,
) -> crate::Result<()> {
let cli = Cli::parse();
if let Some(ws_env) = std::env::var_os("SUBX_WORKSPACE") {
std::env::set_current_dir(&ws_env).map_err(|e| {
crate::error::SubXError::CommandExecution(format!(
"Failed to set workspace directory to {}: {}",
std::path::PathBuf::from(&ws_env).display(),
e
))
})?;
} else if let Ok(config) = config_service.get_config() {
let ws_dir = &config.general.workspace;
if !ws_dir.as_os_str().is_empty() {
std::env::set_current_dir(ws_dir).map_err(|e| {
crate::error::SubXError::CommandExecution(format!(
"Failed to set workspace directory to {}: {}",
ws_dir.display(),
e
))
})?;
}
}
crate::commands::dispatcher::dispatch_command_with_ref(cli.command, config_service).await
}