in resctl-demo/src/doc.rs [34:116]
fn load_docs() -> BTreeMap<String, &'static str> {
let mut docs = BTreeMap::new();
let mut graphs = HashSet::new();
let mut targets = HashSet::new();
for i in 0..index::SOURCES.len() {
let src = index::SOURCES[i];
info!("Loading doc {}", i);
let doc = match RdDoc::parse(src.as_bytes()) {
Ok(v) => v,
Err(e) => panic!("Failed to load {:?}... ({:?})", &src[..100], &e),
};
let mut register_one_cmd = |cmd: &RdCmd| match cmd {
RdCmd::On(sw) | RdCmd::Toggle(sw) => match sw {
RdSwitch::Sideload(tag, _id) => {
SIDELOAD_NAMES.lock().unwrap().insert(tag.into());
}
RdSwitch::Sysload(tag, _id) => {
SYSLOAD_NAMES.lock().unwrap().insert(tag.into());
}
_ => {}
},
RdCmd::Graph(tag) => {
if tag.len() > 0 {
graphs.insert(tag.clone());
}
}
RdCmd::Jump(t) => {
targets.insert(t.to_string());
}
_ => {}
};
for cmd in doc
.pre_cmds
.iter()
.chain(doc.body.iter().filter_map(|para| {
if let RdPara::Prompt(_, cmd) = para {
Some(cmd)
} else {
None
}
}))
.chain(doc.post_cmds.iter())
{
if let RdCmd::Group(group) = cmd {
for cmd in group {
register_one_cmd(cmd);
}
} else {
register_one_cmd(cmd);
}
}
docs.insert(doc.id.clone(), src);
}
info!("SIDELOAD_NAMES: {:?}", &SIDELOAD_NAMES.lock().unwrap());
info!("SYSLOAD_NAMES: {:?}", &SYSLOAD_NAMES.lock().unwrap());
let mut nr_missing = 0;
let graph_tags: HashSet<String> = GraphTag::into_enum_iter()
.map(|x| format!("{:?}", x))
.collect();
for tag in graphs.iter() {
if !graph_tags.contains(tag) {
error!("doc: invalid graph tag {:?}", tag);
nr_missing += 1;
}
}
for t in targets {
if !docs.contains_key(&t) {
error!("doc: invalid jump target {:?}", t);
nr_missing += 1;
}
}
assert!(nr_missing == 0);
docs
}