devalang_core/core/store/
variable.rs1use 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 if let Some(v) = self.variables.get(name) {
33 return Some(v);
34 }
35
36 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}