helios/cli/src/main.rs

101 lines
2.6 KiB
Rust
Raw Normal View History

use std::{fs, path::PathBuf, process::exit};
2022-08-29 20:54:58 +00:00
use clap::Parser;
use common::utils::hex_str_to_bytes;
2022-08-29 20:54:58 +00:00
use dirs::home_dir;
use env_logger::Env;
use eyre::Result;
2022-08-16 22:59:07 +00:00
use client::Client;
2022-08-29 20:54:58 +00:00
use config::{networks, Config};
use futures::executor::block_on;
2022-08-24 01:33:48 +00:00
#[tokio::main]
async fn main() -> Result<()> {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let config = get_config();
let mut client = Client::new(config).await?;
client.start().await?;
ctrlc::set_handler(move || {
block_on(client.shutdown());
exit(0);
})?;
std::future::pending().await
}
fn get_config() -> Config {
2022-08-29 20:54:58 +00:00
let cli = Cli::parse();
let mut config = match cli.network.as_str() {
"mainnet" => networks::mainnet(),
2022-08-29 20:54:58 +00:00
"goerli" => networks::goerli(),
_ => {
let home = home_dir().unwrap();
let config_path = home.join(format!(".lightclient/configs/{}.toml", cli.network));
Config::from_file(&config_path).expect("could not read network config")
2022-08-29 20:54:58 +00:00
}
};
2022-08-20 20:33:32 +00:00
let data_dir = get_data_dir(&cli);
config.general.checkpoint = match cli.checkpoint {
Some(checkpoint) => hex_str_to_bytes(&checkpoint).expect("invalid checkpoint"),
None => get_cached_checkpoint(&data_dir).unwrap_or(config.general.checkpoint),
};
2022-09-23 03:34:34 +00:00
config.general.execution_rpc = Some(cli.execution_rpc);
if let Some(port) = cli.port {
config.general.rpc_port = Some(port);
2022-08-31 00:31:58 +00:00
}
2022-09-13 00:36:04 +00:00
if let Some(consensus_rpc) = cli.consensus_rpc {
config.general.consensus_rpc = consensus_rpc;
}
config.machine.data_dir = Some(data_dir);
config
}
fn get_data_dir(cli: &Cli) -> PathBuf {
match &cli.data_dir {
Some(dir) => PathBuf::from(dir),
None => home_dir()
.unwrap()
.join(format!(".lightclient/data/{}", cli.network)),
}
}
fn get_cached_checkpoint(data_dir: &PathBuf) -> Option<Vec<u8>> {
let checkpoint_file = data_dir.join("checkpoint");
if checkpoint_file.exists() {
let checkpoint_res = fs::read(checkpoint_file);
match checkpoint_res {
Ok(checkpoint) => Some(checkpoint),
Err(_) => None,
}
} else {
None
}
}
2022-08-29 20:54:58 +00:00
#[derive(Parser)]
struct Cli {
#[clap(short, long, default_value = "mainnet")]
2022-08-29 20:54:58 +00:00
network: String,
#[clap(short, long)]
port: Option<u16>,
2022-09-13 00:36:04 +00:00
#[clap(short = 'w', long)]
checkpoint: Option<String>,
2022-09-13 00:36:04 +00:00
#[clap(short, long)]
2022-09-23 03:34:34 +00:00
execution_rpc: String,
2022-09-13 00:36:04 +00:00
#[clap(short, long)]
consensus_rpc: Option<String>,
#[clap(long)]
data_dir: Option<String>,
2022-08-29 20:54:58 +00:00
}