use crate::ast::Node;
use std::collections::BTreeMap;
#[derive(Debug)]
pub struct ConstantIndex(pub BTreeMap<String, String>);
impl ConstantIndex {
pub(crate) fn new<'a>(ast: &'a Node<'a>) -> ConstantIndex {
let mut case_values = BTreeMap::new();
if let Node::Root(r) = ast {
for item in r.iter() {
match item {
Node::Constant(vs) => {
if case_values
.insert(vs[0].ident_str().to_string(), vs[1].ident_str().to_string())
.is_some()
{
panic!("duplicate case keys {}", vs[0].ident_str());
}
}
Node::Enum(e) => {
for v in e.variants.iter() {
if case_values
.insert(
v.name.as_str().to_string(),
format!("{}::{}", e.name, v.name.as_str()),
)
.is_some()
{
panic!("duplicate case keys {}", v.name.as_str());
}
}
}
_ => continue,
}
}
}
ConstantIndex(case_values)
}
pub fn get<T: AsRef<str>>(&self, name: T) -> Option<&String> {
self.0.get(name.as_ref())
}
pub fn iter(&self) -> impl std::iter::Iterator<Item = (&String, &String)> {
self.0.iter()
}
}