devalang_core/core/store/
variable.rs

1use std::collections::HashMap;
2
3use devalang_types::Value;
4
5#[derive(Debug, Default, Clone, PartialEq)]
6pub struct VariableTable {
7    pub variables: HashMap<String, Value>,
8    pub parent: Option<Box<VariableTable>>,
9}
10
11impl VariableTable {
12    pub fn new() -> Self {
13        VariableTable {
14            variables: HashMap::new(),
15            parent: None,
16        }
17    }
18
19    pub fn set(&mut self, name: String, value: Value) {
20        self.variables.insert(name, value);
21    }
22
23    pub fn with_parent(parent: VariableTable) -> Self {
24        Self {
25            variables: HashMap::new(),
26            parent: Some(Box::new(parent)),
27        }
28    }
29
30    pub fn get(&self, name: &str) -> Option<&Value> {
31        // First try the local table
32        if let Some(v) = self.variables.get(name) {
33            return Some(v);
34        }
35
36        // Then walk parent chain if present
37        let mut current = &self.parent;
38        while let Some(boxed) = current {
39            if let Some(v) = boxed.variables.get(name) {
40                return Some(v);
41            }
42            current = &boxed.parent;
43        }
44
45        None
46    }
47
48    pub fn remove(&mut self, name: &str) -> Option<Value> {
49        self.variables.remove(name)
50    }
51}