use anyhow::Result;
use clap::Parser;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use theater_cli::{config::Config, run};
#[tokio::main]
async fn main() -> Result<()> {
let cli = theater_cli::Cli::parse();
let config = Config::load().unwrap_or_else(|e| {
eprintln!("Warning: Failed to load config, using defaults: {}", e);
Config::default()
});
let log_level: tracing::Level = cli.log_level.into();
let registry = tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::from_default_env().add_directive(log_level.into()));
registry
.with(tracing_subscriber::fmt::layer().with_target(false))
.init();
let shutdown_token = tokio_util::sync::CancellationToken::new();
let shutdown_token_clone = shutdown_token.clone();
tokio::spawn(async move {
match tokio::signal::ctrl_c().await {
Ok(()) => {
println!("\nReceived interrupt signal, shutting down...");
shutdown_token_clone.cancel();
}
Err(err) => {
eprintln!("Unable to listen for shutdown signal: {}", err);
shutdown_token_clone.cancel();
}
}
});
let result = tokio::select! {
result = run(cli, config, shutdown_token.clone()) => result,
_ = shutdown_token.cancelled() => {
println!("Operation cancelled by user");
std::process::exit(130); }
};
result
}