use abscissa::{Callable, GlobalConfig};
use std::process;
use client::Client;
use config::{KmsConfig, ValidatorConfig};
use keyring::KeyRing;
#[derive(Debug, Options)]
pub struct StartCommand {
#[options(short = "c", long = "config")]
pub config: Option<String>,
#[options(short = "v", long = "verbose")]
pub verbose: bool,
}
impl Default for StartCommand {
fn default() -> Self {
Self {
config: None,
verbose: false,
}
}
}
impl Callable for StartCommand {
fn call(&self) {
info!(
"{} {} starting up...",
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION")
);
let config = KmsConfig::get_global();
KeyRing::load_from_config(&config.providers).unwrap_or_else(|e| {
status_err!("couldn't load keyring: {}", e);
process::exit(1);
});
let validator_clients = spawn_validator_clients(&config.validator);
for client in validator_clients {
client.join();
}
}
}
fn spawn_validator_clients(config: &[ValidatorConfig]) -> Vec<Client> {
config
.iter()
.map(|validator| Client::spawn(validator.clone()))
.collect()
}