check -C and -c first so order of args doesnt matter

pull/14/head
chris west 5 years ago
parent 0d3cd1c3af
commit 9702633354

@ -32,48 +32,19 @@ impl Error for ArgError {
/// Parse command line arguments into a Config structure.
pub fn parse<T: AsRef<str>>(args: &[T]) -> Result<Config, ArgError> {
let mut cfg = if config::exists() {
match config::load() {
Err(e) => return Err(ArgError::new(e)),
Ok(c) => c,
}
} else {
config::default()
};
let mut set_nocfg = false;
let mut set_cfg = false;
let mut cfg = config::default();
// check for config to load / not load first
let mut iter = args.iter();
let mut got_url = false;
let mut set_tls = false;
let mut set_notls = false;
let mut set_tor = false;
let mut set_notor = false;
let mut set_cfg = false;
let mut set_nocfg = false;
while let Some(arg) = iter.next() {
match arg.as_ref() {
"-v" | "--version" | "-version" => {
cfg.mode = Mode::Version;
return Ok(cfg);
}
"-h" | "--help" | "-help" => {
cfg.mode = Mode::Help;
return Ok(cfg);
}
"-r" | "--raw" | "-raw" => {
if args.len() > 1 {
cfg.mode = Mode::Raw;
} else {
return Err(ArgError::new("--raw needs gopher-url"));
}
}
"-p" | "--print" | "-print" => cfg.mode = Mode::Print,
"-l" | "--local" | "-local" => cfg.start = "gopher://127.0.0.1:7070".into(),
"-C" | "--no-config" | "-no-config" => {
if set_cfg {
return Err(ArgError::new("can't mix --config and --no-config"));
}
set_nocfg = true;
cfg = config::default();
set_nocfg = true
}
"-c" | "--config" | "-config" => {
if set_nocfg {
@ -91,12 +62,12 @@ pub fn parse<T: AsRef<str>>(args: &[T]) -> Result<Config, ArgError> {
return Err(ArgError::new("need a config file"));
}
}
arg if arg.starts_with("--config=") || arg.starts_with("-config=") => {
a if a.starts_with("--config=") || a.starts_with("-config=") => {
if set_nocfg {
return Err(ArgError::new("can't mix --config and --no-config"));
}
set_cfg = true;
let mut parts = arg.splitn(2, '=');
let mut parts = arg.as_ref().splitn(2, '=');
if let Some(file) = parts.nth(1) {
cfg = match config::load_file(file) {
Ok(c) => c,
@ -108,6 +79,46 @@ pub fn parse<T: AsRef<str>>(args: &[T]) -> Result<Config, ArgError> {
return Err(ArgError::new("need a config file"));
}
}
_ => {}
}
}
// load phetch.conf from disk if they didn't pass -c or -C
if !set_cfg && !set_nocfg {
match config::load() {
Err(e) => return Err(ArgError::new(e)),
Ok(c) => cfg = c,
}
}
let mut iter = args.iter();
let mut got_url = false;
let mut set_tls = false;
let mut set_notls = false;
let mut set_tor = false;
let mut set_notor = false;
while let Some(arg) = iter.next() {
match arg.as_ref() {
"-v" | "--version" | "-version" => {
cfg.mode = Mode::Version;
return Ok(cfg);
}
"-h" | "--help" | "-help" => {
cfg.mode = Mode::Help;
return Ok(cfg);
}
"-r" | "--raw" | "-raw" => {
if args.len() > 1 {
cfg.mode = Mode::Raw;
} else {
return Err(ArgError::new("--raw needs gopher-url"));
}
}
"-p" | "--print" | "-print" => cfg.mode = Mode::Print,
"-l" | "--local" | "-local" => cfg.start = "gopher://127.0.0.1:7070".into(),
"-C" | "--no-config" | "-no-config" => {}
"-c" | "--config" | "-config" => {}
arg if arg.starts_with("--config=") || arg.starts_with("-config=") => {}
"-s" | "--tls" | "-tls" => {
if set_notls {
return Err(ArgError::new("can't set both --tls and --no-tls"));
@ -242,6 +253,13 @@ mod tests {
assert_eq!(cfg.tls, false);
}
#[test]
fn test_mix_and_match() {
let cfg = parse(&["-r", "-s", "-C"]).expect("should work");
assert_eq!(cfg.mode, Mode::Raw);
assert_eq!(cfg.tls, true);
}
#[test]
fn test_config() {
let err = parse(&["-c"]).expect_err("should fail");

Loading…
Cancel
Save