dee 0.0.18

An cli for drand, with support for timelock encryption.
use anyhow::anyhow;
use std::process;

mod cli;
mod cmd;
mod config;
mod print;
mod time;

fn main() {
    let cli = cli::build();
    let mut cfg: config::Local = config::Local::load();
    env_logger::Builder::new()
        .filter_level(cli.verbose.log_level_filter())
        .init();

    let output = match cli.command {
        cli::Commands::Rand {
            set_upstream,
            verify,
            long,
            json,
            beacon,
        } => match cfg.set_upstream_and_chain(set_upstream) {
            Ok(chain) => cmd::rand(&cfg, print::Format::new(long, json), chain, beacon, verify),
            Err(err) => Err(err),
        },
        cli::Commands::Crypt {
            encrypt,
            decrypt,
            inspect,
            set_upstream,
            round,
            armor,
            output,
            input,
        } => {
            let is_inspect = inspect.is_true();
            match cfg.set_upstream_and_chain(set_upstream) {
                Ok(chain) => match (encrypt, decrypt, is_inspect) {
                    (true, false, false) => {
                        cmd::crypt::encrypt(&cfg, output, input, armor, chain, round)
                    }
                    (_, true, _) => cmd::crypt::decrypt(&cfg, output, input, chain),
                    (_, _, true) => cmd::crypt::inspect(
                        &cfg,
                        print::Format::new(inspect.long(), inspect.json()),
                        input,
                        chain,
                    ),
                    _ => unreachable!(),
                },
                Err(err) => Err(err),
            }
        }
        cli::Commands::Remote { command } => match command {
            Some(command) => match command {
                cli::RemoteCommand::Add { name, url } => cmd::remote::add(&mut cfg, name, &url),
                cli::RemoteCommand::Remove { name } => cmd::remote::remove(&mut cfg, name),
                cli::RemoteCommand::Rename { old, new } => cmd::remote::rename(&mut cfg, old, new),
                cli::RemoteCommand::SetUrl { name, url } => {
                    cmd::remote::set_url(&mut cfg, name, &url)
                }
                cli::RemoteCommand::Show { long, json, name } => cmd::remote::show(
                    &cfg,
                    print::Format::new(long, json),
                    name.or(cfg.upstream())
                        .ok_or(anyhow!("No chain or upstream"))
                        .unwrap(),
                ),
            },
            None => cmd::remote::list(&cfg),
        },
    };

    match output {
        Ok(result) => {
            cfg.store().unwrap();
            if !result.is_empty() {
                println!("{result}")
            }
        }
        Err(err) => {
            eprintln!("error: {err}");
            process::exit(1)
        }
    }
}