use std::env::Args;
#[derive(Debug)]
pub struct Flag {
key: String,
val: String
}
impl Flag {
pub fn new(key: &str, val: &str) -> Self {
Self {key: key.to_string(), val: val.to_string()}
}
pub fn same(&self, input: &str) -> bool {
self.key == input
}
pub fn get(&self) -> &str {
&self.val
}
}
pub struct FlagDetect {
prefix: String,
flags: Vec<Flag>
}
pub struct StaticFlagOnly {}
impl StaticFlagOnly {
pub fn get(prefix: &str, args: Args) -> Vec<String> {
let size = args.len();
args.rev().take(size-prefix.len())
.map(|x| x.replace(prefix, ""))
.filter(|x| x.contains(prefix))
.rev().collect()
}
pub fn getn(prefix: &str, args: Args) -> Vec<String> {
let x = self::StaticFlagOnly::get(prefix, args).join("");
x.split("").map(|x| x.to_string()).collect()
}
}
pub struct StaticFlag { }
impl StaticFlag {
pub fn get(prefix: &str, args: Args) -> Vec<Flag> {
let mut next = false;
let mut flags = Vec::new();
let mut last = "".to_string();
for a1 in args {
if a1.contains(prefix) {
next = true;
last = a1;
} else if next {
flags.push(Flag::new(&last, &a1));
}
}
flags
}
pub fn getn(prefixn: Vec<&str>, args: Args) -> Vec<Flag> {
let mut next = false;
let mut flags = Vec::new();
let mut last = "".to_string();
for a in args {
let prefixn = prefixn.clone();
for prefix in prefixn {
if a.contains(prefix) {
next = true;
last = a.clone();
} else if next {
flags.push(Flag::new(&last, &a));
}
}
}
flags
}
}
impl FlagDetect {
pub fn new(prefix: &str) -> Self {
Self {prefix: prefix.to_string(), flags: Vec::new()}
}
pub fn new_args(prefix: &str, args: Args) -> Self {
let mut sel = Self::new(prefix);
sel.from_args(args);
sel
}
pub fn from_args(&mut self, a: Args) {
let mut next = false;
let mut last = "".to_string();
for a1 in a {
if a1.contains(&self.prefix) {
next = true;
last = a1;
} else if next {
self.flags.push(Flag::new(&last, &a1));
}
}
}
pub fn find(&self, s: &str) -> Option<String> {
for x in self.flags.iter() {
if x.same(s) {
return Some(x.get().to_string())
}
}
None
}
}