|
|
|
@ -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");
|
|
|
|
|