mod cli;
mod config;
mod constants;
mod error;
mod error_logger;
mod exporter;
mod logging;
mod parser;
use config::Config;
use error::Result;
use log::info;
use std::path::Path;
fn main() -> Result<()> {
use clap::Parser;
let cli = cli::opts::Cli::parse();
match &cli.command {
Some(cli::opts::Commands::Init { output, force }) => {
env_logger::init();
cli::init::handle_init(output, *force)
}
Some(cli::opts::Commands::Run { config })
| Some(cli::opts::Commands::Validate { config }) => {
let path = Path::new(config);
let cfg = match Config::from_file(path) {
Ok(c) => {
eprintln!("Loaded configuration file: {}", config);
c
}
Err(e) => {
if let error::Error::Config(error::ConfigError::NotFound(_)) = &e {
eprintln!(
"Configuration file not found: {}, using default configuration",
config
);
eprintln!("Tip: run 'sqllog2db init' to generate a configuration file");
Config::default()
} else {
return Err(e);
}
}
};
cfg.validate()?;
eprintln!("Configuration validation passed");
logging::init_logging(&cfg.logging)?;
info!("Application started");
match &cli.command {
Some(cli::opts::Commands::Run { .. }) => cli::run::handle_run(&cfg),
Some(cli::opts::Commands::Validate { .. }) => cli::validate::handle_validate(&cfg),
_ => unreachable!(),
}
}
None => {
eprintln!("Please specify a subcommand. Use --help to see available commands.");
std::process::exit(1);
}
}
}