use std::error::Error;
use std::path::PathBuf;
use structopt::StructOpt;
fn parse_tuple<T>(s: &str) -> Result<(T, T), Box<dyn Error>>
where
T: std::str::FromStr,
T::Err: Error + 'static,
{
let pos = s.find(',').ok_or_else(|| {
format!(
"Expected format: file1.rs,file2.rs. No `,` found in `{}`",
s
)
})?;
Ok((s[..pos].parse()?, s[pos + 1..].parse()?))
}
#[derive(StructOpt, Debug)]
pub struct Config {
#[structopt(name = "INPUT_FILE", parse(from_os_str))]
pub input: Option<PathBuf>,
#[structopt(long = "diff", parse(try_from_str = parse_tuple))]
pub files: Option<(String, String)>,
#[structopt(long = "unpretty", default_value = "hir")]
pub unpretty: String,
#[structopt(long = "format", default_value = "svg")]
pub format: String,
#[structopt(short = "v", long = "verbose")]
pub verbose: bool,
#[structopt(long = "plain")]
pub plain: bool,
#[structopt(name = "THEME", long = "theme")]
pub theme: Option<String>,
#[structopt(long = "list-themes")]
pub list_themes: bool,
}
#[derive(StructOpt, Debug)]
#[structopt(bin_name = "cargo")]
pub enum Opt {
#[structopt(name = "inspect")]
Config(Config),
}