use std::collections::HashSet;
use std::collections::HashMap;
use std::str::FromStr;
use std::any::Any;
#[derive(Default, Debug)]
pub struct ParsingResults {
path: String,
flags: HashSet<String>,
named_params: HashMap<String, Box<Any>>,
unnamed_params: Vec<String>,
}
impl ParsingResults {
pub fn new() -> ParsingResults {
ParsingResults {
path: String::new(),
flags: HashSet::<String>::new(),
named_params: HashMap::<String, Box<Any>>::new(),
unnamed_params: Vec::<String>::new(),
}
}
pub fn path(&self) -> &String {
&self.path
}
pub fn path_mut(&mut self) -> &mut String {
&mut self.path
}
pub fn flags(&self) -> &HashSet<String> {
&self.flags
}
pub fn flags_mut(&mut self) -> &mut HashSet<String> {
&mut self.flags
}
pub fn named_params(&self) -> &HashMap<String, Box<Any>> {
&self.named_params
}
pub fn named_params_mut(&mut self) -> &mut HashMap<String, Box<Any>> {
&mut self.named_params
}
pub fn unnamed_params(&self) -> &Vec<String> {
&self.unnamed_params
}
pub fn unnamed_params_mut(&mut self) -> &mut Vec<String> {
&mut self.unnamed_params
}
pub fn flag(&self, name: &str) -> bool {
self.flags.contains(name)
}
pub fn named_param<T: 'static + FromStr>(&self, name: &str) -> Option<&T> {
match self.named_params.get(name) {
Some(value) => {
if !value.is::<T>() {
panic!("clargs: specified type does not match the specified parameter's associated type");
}
Some(value.downcast_ref::<T>().unwrap())
},
None => None,
}
}
pub fn named_param_mut<T: 'static + FromStr>(&mut self, name: &str) -> Option<&mut T> {
match self.named_params.get_mut(name) {
Some(value) => {
if !value.is::<T>() {
panic!("clargs: specified type does not match the specified parameter's associated type");
}
Some(value.downcast_mut::<T>().unwrap())
},
None => None,
}
}
pub fn num_unnamed_params(&self) -> usize {
self.unnamed_params.len()
}
pub fn unnamed_param(&self, index: usize) -> &String {
if index >= self.unnamed_params.len() {
panic!("clargs: attempted to access a non-existant unnamed parameter");
}
&self.unnamed_params[index]
}
pub fn unnamed_param_mut(&mut self, index: usize) -> &mut String {
if index >= self.unnamed_params.len() {
panic!("clargs: attempted to access a non-existant unnamed parameter");
}
&mut self.unnamed_params[index]
}
}