use crate::shared::shell::SupportedChains;
use multiaddr::Multiaddr;
use serde::{Deserialize, Serialize};
use std::{net::IpAddr, path::PathBuf};
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
#[structopt(
name = "Gadget",
about = "An MPC executor that connects to the Tangle network to perform work"
)]
pub struct Opt {
#[structopt(global = true, parse(from_os_str), short = "c", long = "config")]
pub config: Option<PathBuf>,
#[structopt(long, short = "v", global = true, parse(from_occurrences))]
pub verbose: i32,
#[structopt(global = true, long)]
pub pretty: bool,
#[structopt(flatten)]
pub options: GadgetConfig,
}
#[derive(Debug, StructOpt, Serialize, Deserialize)]
pub struct GadgetConfig {
#[structopt(long = "bind-ip", short = "i", default_value = defaults::BIND_IP)]
#[serde(default = "defaults::bind_ip")]
pub bind_addr: IpAddr,
#[structopt(long = "port", short = "p", default_value = defaults::BIND_PORT)]
#[serde(default = "defaults::bind_port")]
pub bind_port: u16,
#[structopt(long = "url", parse(try_from_str = url::Url::parse), default_value = defaults::HTTP_RPC_URL)]
#[serde(default = "defaults::http_rpc_url")]
pub http_rpc_url: url::Url,
#[structopt(long = "url", parse(try_from_str = url::Url::parse), default_value = defaults::WS_RPC_URL)]
#[serde(default = "defaults::ws_rpc_url")]
pub ws_rpc_url: url::Url,
#[structopt(long = "bootnodes", parse(try_from_str = <Multiaddr as std::str::FromStr>::from_str))]
#[serde(default)]
pub bootnodes: Vec<Multiaddr>,
#[structopt(long, short = "d")]
pub keystore_uri: String,
#[structopt(long = "keystore-password", env)]
pub keystore_password: Option<String>,
#[structopt(
long,
default_value,
possible_values = &[
"local_testnet",
"local_mainnet",
"testnet",
"mainnet"
]
)]
#[serde(default)]
pub chain: SupportedChains,
#[structopt(long, short = "v", global = true, parse(from_occurrences))]
pub verbose: i32,
#[structopt(global = true, long)]
pub pretty: bool,
}
pub mod defaults {
pub const BIND_PORT: &str = "30555";
pub const BIND_IP: &str = "0.0.0.0";
pub const HTTP_RPC_URL: &str = "http://127.0.0.1:9944";
pub const WS_RPC_URL: &str = "ws://127.0.0.1:9944";
pub fn http_rpc_url() -> url::Url {
url::Url::parse(HTTP_RPC_URL).expect("Default RPC URL is valid")
}
pub fn ws_rpc_url() -> url::Url {
url::Url::parse(WS_RPC_URL).expect("Default RPC URL is valid")
}
pub fn bind_ip() -> std::net::IpAddr {
BIND_IP.parse().expect("Default bind IP is valid")
}
pub fn bind_port() -> u16 {
BIND_PORT.parse().expect("Default bind port is valid")
}
}