use crate::errors::{Error, Result};
use std::default::Default;
use std::str::FromStr;
const HELPMSG: &str = r#"Available unstable options:
-Z help Lists all unstable options
-Z continue-on-errors Keep compiling even when severe errors occur
-Z min-crossrefs=<num> Equivalent to bibtex's -min-crossrefs flag - "include after <num>
crossrefs" [default: 2]
-Z paper-size=<spec> Change the default paper size [default: letter]
"#;
#[derive(Debug)]
pub enum UnstableArg {
ContinueOnErrors,
Help,
MinCrossrefs(i32),
PaperSize(String),
ShellEscapeEnabled,
}
impl FromStr for UnstableArg {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
let mut splitter = s.splitn(2, '=');
let arg = splitter.next().unwrap(); let value = splitter.next();
match arg {
"help" => Ok(UnstableArg::Help),
"continue-on-errors" => Ok(UnstableArg::ContinueOnErrors),
"min-crossrefs" => value
.ok_or_else(|| {
"'-Z min-crossrefs <spec>' requires a value but none was supplied".into()
})
.and_then(|s| {
FromStr::from_str(s).map_err(|e| format!("-Z min-crossrefs: {}", e).into())
})
.map(UnstableArg::MinCrossrefs),
"paper-size" => value
.ok_or_else(|| {
"'-Z paper-size <spec>' requires a value but none was supplied".into()
})
.map(|s| UnstableArg::PaperSize(s.to_string())),
_ => Err(format!("Unknown unstable option '{}'", arg).into()),
}
}
}
#[derive(Debug, Default)]
pub struct UnstableOptions {
pub continue_on_errors: bool,
pub paper_size: Option<String>,
pub shell_escape: bool,
pub min_crossrefs: Option<i32>,
}
impl UnstableOptions {
pub fn from_unstable_args<I>(uargs: I) -> Self
where
I: Iterator<Item = UnstableArg>,
{
let mut opts = UnstableOptions::default();
for u in uargs {
use UnstableArg::*;
match u {
Help => {
print!("{}", HELPMSG);
std::process::exit(0);
}
ContinueOnErrors => opts.continue_on_errors = true,
MinCrossrefs(num) => opts.min_crossrefs = Some(num),
PaperSize(size) => opts.paper_size = Some(size),
ShellEscapeEnabled => opts.shell_escape = true,
}
}
opts
}
}