1#![feature(try_blocks)]23pub mod command;4pub mod host;5pub mod keys;67pub mod cmds;8pub mod nix;910mod fleetdata;1112use std::io;1314use anyhow::{anyhow, Result};15use structopt::clap::AppSettings::*;16use structopt::StructOpt;1718use cmds::{build_systems::BuildSystems, info::Info, secrets::Secrets};19use host::{Config, FleetOpts};20use tracing::{info, metadata::LevelFilter};21use tracing_subscriber::EnvFilter;2223#[derive(StructOpt)]24enum Opts {25 26 BuildSystems(BuildSystems),27 28 Secrets(Secrets),29 30 Info(Info),31}3233#[derive(StructOpt)]34#[structopt(35 version = "1.0",36 author,37 global_setting(ColorAuto),38 global_setting(ColoredHelp)39)]40struct RootOpts {41 #[structopt(flatten)]42 fleet_opts: FleetOpts,43 #[structopt(subcommand)]44 command: Opts,45}4647async fn run_command(config: &Config, command: Opts) -> Result<()> {48 match command {49 Opts::BuildSystems(c) => c.run(config).await?,50 Opts::Secrets(s) => s.run(config).await?,51 Opts::Info(i) => i.run(config).await?,52 };53 Ok(())54}5556#[tokio::main]57async fn main() -> Result<()> {58 let filter = EnvFilter::from_default_env().add_directive(LevelFilter::INFO.into());59 tracing_subscriber::FmtSubscriber::builder()60 .with_env_filter(filter)61 .without_time()62 .with_target(false)63 .with_writer(|| {64 65 io::stderr()66 })67 .try_init()68 .map_err(|e| anyhow!("Failed to initialize logger: {}", e))?;6970 info!("Starting");71 let opts = RootOpts::from_args();72 let config = opts.fleet_opts.build()?;7374 match run_command(&config, opts.command).await {75 Ok(()) => {76 config.save()?;77 Ok(())78 }79 Err(e) => {80 let _ = config.save();81 Err(e)82 }83 }84}