use std::{net::SocketAddr, str::FromStr};
use structopt::StructOpt;
use thiserror::Error;
use zebra_chain::block::Height;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Backend {
Zebrad,
Zcashd,
}
impl FromStr for Backend {
type Err = InvalidBackendError;
fn from_str(string: &str) -> Result<Self, Self::Err> {
match string.to_lowercase().as_str() {
"zebrad" => Ok(Backend::Zebrad),
"zcashd" => Ok(Backend::Zcashd),
_ => Err(InvalidBackendError(string.to_owned())),
}
}
}
#[derive(Clone, Debug, Error, PartialEq, Eq)]
#[error("Invalid backend: {0}")]
pub struct InvalidBackendError(String);
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Transport {
Cli,
Direct,
}
impl FromStr for Transport {
type Err = InvalidTransportError;
fn from_str(string: &str) -> Result<Self, Self::Err> {
match string.to_lowercase().as_str() {
"cli" | "zcash-cli" | "zcashcli" | "zcli" | "z-cli" => Ok(Transport::Cli),
"direct" => Ok(Transport::Direct),
_ => Err(InvalidTransportError(string.to_owned())),
}
}
}
#[derive(Clone, Debug, Error, PartialEq, Eq)]
#[error("Invalid transport: {0}")]
pub struct InvalidTransportError(String);
#[derive(Clone, Debug, Eq, PartialEq, StructOpt)]
pub struct Args {
#[structopt(default_value = "zebrad", short, long)]
pub backend: Backend,
#[structopt(default_value = "cli", short, long)]
pub transport: Transport,
#[structopt(default_value = "zcash-cli", short, long)]
pub cli: String,
#[structopt(short, long)]
pub addr: Option<SocketAddr>,
#[structopt(short, long)]
pub last_checkpoint: Option<Height>,
#[structopt(last = true)]
pub zcli_args: Vec<String>,
}