diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-30 17:26:03 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-30 17:26:03 +0800 |
| commit | 4421fb2794f2af292f8781e7d12ae002a3f10a9b (patch) | |
| tree | 31a358dd80a7e1d3855f4a6281eaf5e010bfb429 /mingling/src/parser/args.rs | |
| parent | c9e3676e0e2353dc09471c783a3a263dee0fdcb1 (diff) | |
Add argument parser module with picker API
Diffstat (limited to 'mingling/src/parser/args.rs')
| -rw-r--r-- | mingling/src/parser/args.rs | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/mingling/src/parser/args.rs b/mingling/src/parser/args.rs new file mode 100644 index 0000000..e659feb --- /dev/null +++ b/mingling/src/parser/args.rs @@ -0,0 +1,95 @@ +use mingling_core::{Flag, special_argument, special_flag}; + +pub struct Argument { + vec: Vec<String>, +} + +impl From<&'static str> for Argument { + fn from(s: &'static str) -> Self { + Argument { + vec: vec![s.to_string()], + } + } +} + +impl From<&'static [&'static str]> for Argument { + fn from(slice: &'static [&'static str]) -> Self { + Argument { + vec: slice.iter().map(|&s| s.to_string()).collect(), + } + } +} + +impl<const N: usize> From<[&'static str; N]> for Argument { + fn from(slice: [&'static str; N]) -> Self { + Argument { + vec: slice.iter().map(|&s| s.to_string()).collect(), + } + } +} + +impl<const N: usize> From<&'static [&'static str; N]> for Argument { + fn from(slice: &'static [&'static str; N]) -> Self { + Argument { + vec: slice.iter().map(|&s| s.to_string()).collect(), + } + } +} + +impl From<Vec<String>> for Argument { + fn from(vec: Vec<String>) -> Self { + Argument { vec } + } +} + +impl AsRef<[String]> for Argument { + fn as_ref(&self) -> &[String] { + &self.vec + } +} + +impl std::ops::Deref for Argument { + type Target = Vec<String>; + + fn deref(&self) -> &Self::Target { + &self.vec + } +} + +impl std::ops::DerefMut for Argument { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.vec + } +} + +impl Argument { + /// Extracts argument (with value) from arguments + pub fn pick_argument<F>(&mut self, flag: F) -> Option<String> + where + F: Into<Flag>, + { + let flag: Flag = flag.into(); + for argument in flag.iter() { + let value = special_argument!(self.vec, argument); + if value.is_some() { + return value; + } + } + None + } + + /// Extracts flags from arguments + pub fn pick_flag<F>(&mut self, flag: F) -> bool + where + F: Into<Flag>, + { + let flag: Flag = flag.into(); + for argument in flag.iter() { + let enabled = special_flag!(self.vec, argument); + if enabled { + return enabled; + } + } + false + } +} |
