use std::collections::HashSet;
use std::fmt::{Debug, Formatter, Result};
pub struct ArgGroup<'n, 'ar> {
#[doc(hidden)]
pub name: &'n str,
#[doc(hidden)]
pub args: HashSet<&'ar str>,
#[doc(hidden)]
pub required: bool,
#[doc(hidden)]
pub requires: Option<HashSet<&'ar str>>,
#[doc(hidden)]
pub conflicts: Option<HashSet<&'ar str>>
}
impl<'n, 'ar> ArgGroup<'n, 'ar> {
pub fn with_name(n: &'n str) -> ArgGroup<'n, 'ar> {
ArgGroup {
name: n,
required: false,
args: HashSet::new(),
requires: None,
conflicts: None
}
}
pub fn add(mut self, n: &'ar str) -> ArgGroup<'n, 'ar> {
self.args.insert(n);
self
}
pub fn add_all(mut self, ns: Vec<&'ar str>) -> ArgGroup<'n, 'ar> {
for n in ns {
self = self.add(n);
}
self
}
pub fn required(mut self, r: bool) -> ArgGroup<'n, 'ar> {
self.required = r;
self
}
pub fn requires(mut self, n: &'ar str) -> ArgGroup<'n, 'ar> {
if let Some(ref mut reqs) = self.requires {
reqs.insert(n);
} else {
let mut hs = HashSet::new();
hs.insert(n);
self.requires = Some(hs);
}
self
}
pub fn requires_all(mut self, ns: Vec<&'ar str>) -> ArgGroup<'n, 'ar> {
for n in ns {
self = self.requires(n);
}
self
}
pub fn conflicts_with(mut self, n: &'ar str) -> ArgGroup<'n, 'ar> {
if let Some(ref mut confs) = self.conflicts {
confs.insert(n);
} else {
let mut hs = HashSet::new();
hs.insert(n);
self.conflicts = Some(hs);
}
self
}
pub fn conflicts_with_all(mut self, ns: Vec<&'ar str>) -> ArgGroup<'n, 'ar> {
for n in ns {
self = self.conflicts_with(n);
}
self
}
}
impl<'n, 'ar> Debug for ArgGroup<'n, 'ar> {
fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "{{
name:{:?},
args: {:?},
required: {:?},
requires: {:?},
conflicts: {:?},
}}", self.name, self.args, self.required, self.requires, self.conflicts)
}
}