use std::collections::BTreeSet;
use regex::Regex;
pub struct Config<'a> {
pub enable_self: bool,
pub enable_output: bool,
pub enable_attrs: BTreeSet<&'a str>
}
lazy_static! {
static ref RE1: Regex = Regex::new(r#"([a-zA-Z0-9_]+)( = "([a-zA-Z0-9,_]*)")?"#).unwrap();
static ref RE2: Regex = Regex::new(r#"[a-zA-Z0-9_]*"#).unwrap();
}
pub fn get_config<'a>(attrs: &'a str) -> Config<'a> {
let mut config = Config {
enable_self: true,
enable_output: true,
enable_attrs: BTreeSet::new()
};
for cap in RE1.captures_iter(attrs.as_ref()) {
if let Some(m) = cap.get(1) {
match m.as_str() {
"disable_self" => config.enable_self = false,
"disable_output" => config.enable_output = false,
"enable_attrs" => {
if let Some(inner) = cap.get(3) {
for cap in RE2.captures_iter(inner.as_str()) {
if let Some(m) = cap.get(0) {
config.enable_attrs.insert(m.as_str());
}
}
}
},
other => panic!("attribute \"{}\" is not known", other)
}
}
}
config
}