From 4421fb2794f2af292f8781e7d12ae002a3f10a9b Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 30 Mar 2026 17:26:03 +0800 Subject: Add argument parser module with picker API --- mingling/src/parser/args.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 mingling/src/parser/args.rs (limited to 'mingling/src/parser/args.rs') 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, +} + +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 From<[&'static str; N]> for Argument { + fn from(slice: [&'static str; N]) -> Self { + Argument { + vec: slice.iter().map(|&s| s.to_string()).collect(), + } + } +} + +impl 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> for Argument { + fn from(vec: Vec) -> Self { + Argument { vec } + } +} + +impl AsRef<[String]> for Argument { + fn as_ref(&self) -> &[String] { + &self.vec + } +} + +impl std::ops::Deref for Argument { + type Target = Vec; + + 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(&mut self, flag: F) -> Option + where + F: Into, + { + 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(&mut self, flag: F) -> bool + where + F: Into, + { + let flag: Flag = flag.into(); + for argument in flag.iter() { + let enabled = special_flag!(self.vec, argument); + if enabled { + return enabled; + } + } + false + } +} -- cgit