mod app;
mod components;
mod config;
mod constants;
mod error;
mod logger;
mod services;
mod theme;
mod utils;
mod validation;
use app::application_lifecycle::ApplicationLifecycle;
use clap::{Arg, Command};
use config::{get_config_dir, is_config_initialized, wizard::SetupWizard};
use std::error::Error as StdError;
#[tokio::main]
async fn main() -> Result<(), Box<dyn StdError>> {
let matches = Command::new("quetty")
.version(env!("CARGO_PKG_VERSION"))
.about("A powerful terminal-based Azure Service Bus queue manager")
.arg(
Arg::new("config")
.long("config")
.short('c')
.value_name("FILE")
.help("Use custom configuration file"),
)
.arg(
Arg::new("setup")
.long("setup")
.action(clap::ArgAction::SetTrue)
.help("Run interactive setup wizard to create configuration"),
)
.arg(
Arg::new("config-dir")
.long("config-dir")
.action(clap::ArgAction::SetTrue)
.help("Show configuration directory path and exit"),
)
.arg(
Arg::new("profile")
.long("profile")
.short('p')
.value_name("NAME")
.help("Use specified profile (default: 'default')"),
)
.get_matches();
if matches.get_flag("config-dir") {
match get_config_dir() {
Ok(config_dir) => {
println!("Configuration directory: {}", config_dir.display());
println!("Initialized: {}", is_config_initialized());
return Ok(());
}
Err(e) => {
eprintln!("Error: Failed to determine config directory: {e}");
std::process::exit(1);
}
}
}
let profile_name = matches
.get_one::<String>("profile")
.map(|s| s.as_str())
.unwrap_or("default");
if matches.get_flag("setup") {
match SetupWizard::run_for_profile(profile_name) {
Ok(()) => {
return Ok(());
}
Err(e) => {
eprintln!("Error: Setup failed for profile '{profile_name}': {e}");
std::process::exit(1);
}
}
}
let custom_config_path = matches.get_one::<String>("config").map(|s| s.as_str());
let mut model =
ApplicationLifecycle::initialize_with_config_and_profile(custom_config_path, profile_name)
.await?;
if let Err(e) = logger::setup_logger() {
eprintln!("Failed to initialize logger: {e}");
}
ApplicationLifecycle::setup_terminal(&mut model)?;
ApplicationLifecycle::run_application_loop(&mut model)?;
ApplicationLifecycle::shutdown_application(model)?;
Ok(())
}