use crate::shared::shell::SupportedChains;
use clap::Parser;
use multiaddr::Multiaddr;
use serde::{Deserialize, Serialize};
use std::{net::IpAddr, path::PathBuf};
#[derive(Debug, Parser)]
#[command(
name = "Gadget",
about = "An MPC executor that connects to the Tangle network to perform work"
)]
pub struct Opt {
#[arg(global = true, short = 'c', long = "config")]
pub config: Option<PathBuf>,
#[command(flatten)]
pub options: GadgetConfig,
}
#[derive(Debug, Parser, Serialize, Deserialize)]
pub struct GadgetConfig {
#[arg(long = "bind-ip", short = 'i', default_value = defaults::BIND_IP)]
#[serde(default = "defaults::bind_ip")]
pub bind_addr: IpAddr,
#[arg(long = "port", short = 'p', default_value = defaults::BIND_PORT)]
#[serde(default = "defaults::bind_port")]
pub bind_port: u16,
#[arg(long = "url", value_parser = url::Url::parse, default_value = defaults::HTTP_RPC_URL)]
#[serde(default = "defaults::http_rpc_url")]
pub http_rpc_url: url::Url,
#[arg(long = "url", value_parser = url::Url::parse, default_value = defaults::WS_RPC_URL)]
#[serde(default = "defaults::ws_rpc_url")]
pub ws_rpc_url: url::Url,
#[arg(long = "bootnodes", value_parser = <Multiaddr as std::str::FromStr>::from_str, action = clap::ArgAction::Append)]
#[serde(default)]
pub bootnodes: Vec<Multiaddr>,
#[arg(long, short = 'd')]
pub keystore_uri: String,
#[arg(long = "keystore-password", env)]
pub keystore_password: Option<String>,
#[arg(long, default_value_t = SupportedChains::LocalTestnet)]
#[serde(default)]
pub chain: SupportedChains,
#[arg(long, short = 'v', global = true, action = clap::ArgAction::Count)]
pub verbose: u8,
#[arg(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")
}
}