use leo_ast::*;
use leo_errors::{Handler, NameValidationError};
use snarkvm::prelude::{Program, TestnetV0};
pub struct NameValidationVisitor<'a> {
pub handler: &'a mut Handler,
}
impl NameValidationVisitor<'_> {
pub fn does_not_contain_aleo(&self, name: Identifier, item_type: &str) {
if name.to_string().contains("aleo") {
self.handler.emit_err(NameValidationError::illegal_name_content(name, item_type, "aleo", name.span));
}
}
pub fn is_not_keyword(&self, name: Identifier, item_type: &str, whitelist: &[&str]) {
let restricted = Program::<TestnetV0>::RESTRICTED_KEYWORDS.iter().flat_map(|(_, kws)| kws.iter().copied());
let keywords = Program::<TestnetV0>::KEYWORDS.iter().copied();
let aleo = std::iter::once("aleo");
let it = keywords.chain(restricted).chain(aleo).filter(|w| !whitelist.contains(w));
for word in it {
if name.to_string() == word {
self.handler.emit_err(NameValidationError::illegal_name(name, item_type, word, name.span));
break;
}
}
}
}