use crate::commands::SubCmd;
use ant_logging::{LogFormat, LogOutputDest};
use autonomi::InitialPeersConfig;
use autonomi::Network as EvmNetwork;
use autonomi::get_evm_network;
use clap::Parser;
use color_eyre::Result;
use std::time::Duration;
pub(crate) const LOCAL_NETWORK_ID: u8 = 0;
pub(crate) const MAIN_NETWORK_ID: u8 = 1;
pub(crate) const ALPHA_NETWORK_ID: u8 = 2;
#[derive(Debug, Clone, Copy)]
pub struct NetworkId {
id: u8,
}
impl NetworkId {
pub fn new(id: u8) -> Self {
Self { id }
}
pub fn local() -> Self {
Self::new(LOCAL_NETWORK_ID)
}
pub fn alpha() -> Self {
Self::new(ALPHA_NETWORK_ID)
}
pub fn as_u8(&self) -> u8 {
self.id
}
#[allow(dead_code)]
pub fn evm_network(&self, local: bool) -> Result<EvmNetwork> {
match self.id {
0 => Ok(EvmNetwork::new(true)?),
1 => Ok(EvmNetwork::default()),
2 => Ok(EvmNetwork::ArbitrumSepoliaTest),
_ => Ok(get_evm_network(local, Some(self.id))?),
}
}
}
impl std::fmt::Display for NetworkId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.id)
}
}
impl std::str::FromStr for NetworkId {
type Err = color_eyre::eyre::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.parse::<u8>() {
Ok(id) => Ok(NetworkId::new(id)),
Err(_) => Err(color_eyre::eyre::eyre!(
"Invalid network ID: must be a number from 0-255"
)),
}
}
}
#[derive(Parser)]
#[command(disable_version_flag = true)]
#[command(author, version, about, long_about = None)]
pub(crate) struct Opt {
#[clap(long)]
pub alpha: bool,
#[clap(subcommand)]
pub command: Option<SubCmd>,
#[clap(long = "timeout", global = true, value_parser = |t: &str| -> Result<Duration> { Ok(t.parse().map(Duration::from_secs)?) }
)]
pub connection_timeout: Option<Duration>,
#[clap(long)]
pub crate_version: bool,
#[clap(long, value_parser = LogFormat::parse_from_str, verbatim_doc_comment)]
pub log_format: Option<LogFormat>,
#[allow(rustdoc::invalid_html_tags)]
#[clap(long, value_parser = LogOutputDest::parse_from_str, verbatim_doc_comment, default_value = "data-dir"
)]
pub log_output_dest: LogOutputDest,
#[clap(long, verbatim_doc_comment, default_value = "1")]
pub network_id: NetworkId,
#[clap(global = true, long = "no-verify", short = 'x')]
pub no_verify: bool,
#[command(flatten)]
pub(crate) peers: InitialPeersConfig,
#[cfg(not(feature = "nightly"))]
#[clap(long)]
pub package_version: bool,
#[clap(long)]
pub protocol_version: bool,
#[clap(long)]
pub version: bool,
}