1pub mod cmds;2pub mod command;3pub mod host;4pub mod keys;56mod fleetdata;78use std::io;910use anyhow::{anyhow, Result};11use structopt::clap::AppSettings::*;12use structopt::StructOpt;1314use cmds::{build_systems::BuildSystems, info::Info, secrets::Secrets};15use host::{Config, FleetOpts};16use tracing::{info, metadata::LevelFilter};17use tracing_subscriber::EnvFilter;1819#[derive(StructOpt)]20enum Opts {21 22 BuildSystems(BuildSystems),23 24 Secrets(Secrets),25 26 Info(Info),27}2829#[derive(StructOpt)]30#[structopt(31 version = "1.0",32 author,33 global_setting(ColorAuto),34 global_setting(ColoredHelp)35)]36struct RootOpts {37 #[structopt(flatten)]38 fleet_opts: FleetOpts,39 #[structopt(subcommand)]40 command: Opts,41}4243async fn run_command(config: &Config, command: Opts) -> Result<()> {44 match command {45 Opts::BuildSystems(c) => c.run(config).await?,46 Opts::Secrets(s) => s.run(config).await?,47 Opts::Info(i) => i.run(config).await?,48 };49 Ok(())50}5152#[tokio::main]53async fn main() -> Result<()> {54 let filter = EnvFilter::from_default_env().add_directive(LevelFilter::INFO.into());55 tracing_subscriber::FmtSubscriber::builder()56 .with_env_filter(filter)57 .without_time()58 .with_target(false)59 .with_writer(|| {60 61 io::stderr()62 })63 .try_init()64 .map_err(|e| anyhow!("Failed to initialize logger: {}", e))?;6566 info!("Starting");67 let opts = RootOpts::from_args();68 let config = opts.fleet_opts.build()?;6970 match run_command(&config, opts.command).await {71 Ok(()) => {72 config.save()?;73 Ok(())74 }75 Err(e) => {76 let _ = config.save();77 Err(e)78 }79 }80}