use cgp::prelude::*;
use eyre::eyre;
use ibc_relayer_types::core::ics02_client::trust_threshold::TrustThreshold;
#[derive(Debug, clap::Parser, HasField)]
pub struct CreateClientArgs {
#[clap(
long = "target-chain",
required = true,
value_name = "TARGET_CHAIN_ID",
help_heading = "REQUIRED"
)]
pub target_chain_id: String,
#[clap(
long = "counterparty-chain",
required = true,
value_name = "COUNTERPARTY_CHAIN_ID",
help_heading = "REQUIRED"
)]
pub counterparty_chain_id: String,
#[clap(long = "clock-drift", value_name = "CLOCK_DRIFT")]
pub clock_drift: Option<humantime::Duration>,
#[clap(long = "trusting-period", value_name = "TRUSTING_PERIOD")]
pub trusting_period: Option<humantime::Duration>,
#[clap(
long = "trust-threshold",
value_name = "TRUST_THRESHOLD",
value_parser = parse_trust_threshold
)]
pub trust_threshold: Option<TrustThreshold>,
}
fn parse_trust_threshold(input: &str) -> eyre::Result<TrustThreshold> {
let (num_part, denom_part) = input
.split_once('/')
.ok_or_else(|| eyre!("expected a fractional argument, eg. '2/3'"))?;
let numerator = num_part
.trim()
.parse()
.map_err(|_| eyre!("invalid trust threshold numerator"))?;
let denominator = denom_part
.trim()
.parse()
.map_err(|_| eyre!("invalid trust threshold denominator"))?;
let trust_threshold = TrustThreshold::new(numerator, denominator)
.map_err(|e| eyre!("invalid trust threshold: {e}"))?;
Ok(trust_threshold)
}