use anyhow::{anyhow, Result};
use rucksack::input::{config, options, Config};
use rucksack::service::actor::Commander;
use rucksack::{command, input};
fn main() -> Result<()> {
let rucksack = command::setup();
let matches = rucksack.clone().get_matches();
let cfg = Config::load(
config::Opts::new()
.file_name(options::config_file(&matches))
.log_level(options::log_level(&matches))
.name(input::constant::NAME.to_string()),
)?;
if options::version(&matches) {
return command::handlers::version();
} else if let Some(shell) = options::completions(&matches) {
return command::handlers::completions(shell, rucksack, cfg.rucksack.name);
}
match matches.subcommand() {
Some(("start", start_matches)) => {
let app = rucksack::App::new(cfg, "".to_string(), start_matches)?;
let daemon = Commander::start(app)?;
match daemon.run() {
Ok(_) => Ok(()),
Err(e) => Err(anyhow!(e)),
}
}
Some((cmd, subcmd_matches)) => {
let app = rucksack::App::new(cfg, cmd.to_string(), subcmd_matches)?;
app.run(&matches)?;
app.shutdown(&matches)
}
None => command::handlers::long_help(rucksack),
}
}