use std::collections::HashMap;
use vb6core::types::VBType;
use vb6runtime::VBVariant;
#[derive(Debug, Clone, Default)]
pub struct Scope {
vars: HashMap<String, VBVariant>,
}
pub(crate) fn normalize(name: &str) -> String {
name.to_lowercase()
}
impl Scope {
pub fn new() -> Self {
Self::default()
}
pub fn declare(&mut self, name: &str, value: VBVariant) {
self.vars.insert(normalize(name), value);
}
pub fn declare_with_type(&mut self, name: &str, ty: &VBType) {
let value = VBVariant::default_for_type(ty);
self.vars.insert(normalize(name), value);
}
pub fn contains(&self, name: &str) -> bool {
self.vars.contains_key(&normalize(name))
}
pub fn get(&self, name: &str) -> Option<&VBVariant> {
self.vars.get(&normalize(name))
}
pub fn set(&mut self, name: &str, value: VBVariant) -> bool {
match self.vars.get_mut(&normalize(name)) {
Some(slot) => {
*slot = value;
true
}
None => false,
}
}
pub fn iter(&self) -> impl Iterator<Item = (&str, &VBVariant)> {
self.vars.iter().map(|(key, value)| (key.as_str(), value))
}
pub fn len(&self) -> usize {
self.vars.len()
}
pub fn is_empty(&self) -> bool {
self.vars.is_empty()
}
}