summaryrefslogtreecommitdiff
path: root/src/args.rs
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2024-04-24 21:37:17 +0200
committerJoel Klinghed <the_jk@spawned.biz>2024-04-24 21:37:17 +0200
commit92742afc7724fd502d65f8056f245c2401d3ce07 (patch)
tree947a874a22ae4be1c5d7bf05a021155ddbe8c7e3 /src/args.rs
parentc0bf5db3c0c4052526d5234144346f3caf767ef9 (diff)
Detect arg parser to use
Switch Parser trait to an object safe trait so guess_parser can return an boxed instance.
Diffstat (limited to 'src/args.rs')
-rw-r--r--src/args.rs29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/args.rs b/src/args.rs
index 0014d66..9f6fe3d 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -1,7 +1,8 @@
+#![allow(dead_code)]
+
use derive_builder::Builder;
use std::collections::HashMap;
-#[allow(dead_code)]
pub enum ValueRequirement {
None,
Required(&'static str),
@@ -96,7 +97,7 @@ pub trait Parser {
fn run(
&self,
options: &mut Options,
- args: impl IntoIterator<Item = String>,
+ args: &mut dyn Iterator<Item = String>,
) -> Result<Arguments, String>;
fn print_help(&self, options: &Options);
}
@@ -128,16 +129,15 @@ impl Parser for LongOnlyParser {
fn run(
&self,
options: &mut Options,
- args: impl IntoIterator<Item = String>,
+ args: &mut dyn Iterator<Item = String>,
) -> Result<Arguments, String> {
let mut ret = Vec::new();
- let mut args_iter = args.into_iter();
- let program = args_iter.next();
- while let Some(arg) = args_iter.next() {
+ let program = args.next();
+ while let Some(arg) = args.next() {
if arg.starts_with("-") {
if arg == "--" {
// All following arguments are just that.
- while let Some(arg) = args_iter.next() {
+ while let Some(arg) = args.next() {
ret.push(arg)
}
break;
@@ -162,7 +162,7 @@ impl Parser for LongOnlyParser {
}
ValueRequirement::Required(_) => {
if value.is_none() {
- value = args_iter.next();
+ value = args.next();
if value.is_none() {
return Err(format!("option '{}' requires an argument", arg));
}
@@ -206,16 +206,15 @@ impl Parser for ShortAndLongParser {
fn run(
&self,
options: &mut Options,
- args: impl IntoIterator<Item = String>,
+ args: &mut dyn Iterator<Item = String>,
) -> Result<Arguments, String> {
let mut ret = Vec::new();
- let mut args_iter = args.into_iter();
- let program = args_iter.next();
- while let Some(arg) = args_iter.next() {
+ let program = args.next();
+ while let Some(arg) = args.next() {
if arg.starts_with("--") {
if arg.len() == 2 {
// All following arguments are just that.
- while let Some(arg) = args_iter.next() {
+ while let Some(arg) = args.next() {
ret.push(arg)
}
break;
@@ -240,7 +239,7 @@ impl Parser for ShortAndLongParser {
}
ValueRequirement::Required(_) => {
if value.is_none() {
- value = args_iter.next();
+ value = args.next();
if value.is_none() {
return Err(format!("option '{}' requires an argument", arg));
}
@@ -260,7 +259,7 @@ impl Parser for ShortAndLongParser {
match option.value_req {
ValueRequirement::None => {}
ValueRequirement::Required(_) => {
- value = args_iter.next();
+ value = args.next();
if value.is_none() {
return Err(format!("option requires an argument -- '{}", c));
}