mex/evaluator/
context.rs

1use super::object;
2use std::collections::HashMap;
3
4pub struct Context <'a> {
5    pub store: Store,
6    pub outer: Option<&'a mut Context<'a>>,
7}
8
9impl <'a> Context <'a> {
10    pub fn new() -> Context<'a> {
11        let store = HashMap::new();
12
13        Context{
14            store: store,
15            outer: None,
16        }
17    }
18
19    pub fn inside(outer: &'a mut Context<'a>) -> Context<'a> {
20        let store = HashMap::new();
21
22        Context{
23            store: store,
24            outer: Some(outer),
25        }
26    }
27
28    pub fn has(&self, name: &String) -> bool {
29        self.store.contains_key(name)
30    }
31
32    pub fn set(&mut self, name: &String, value: object::Object) {
33        if let Some(ref mut outer) = self.outer {
34            if outer.has(name) {
35                return outer.set(name, value);
36            }
37        }
38
39        self.declare(name, value);
40    }
41
42    pub fn declare(&mut self, name: &String, value: object::Object) {
43        self.store.insert(name.clone(), value);
44    }
45
46    pub fn get<'b>(&'b self, name: String) -> Option<&'b object::Object> {
47        if self.store.contains_key(&name) {
48            self.store.get(&name)
49        } else {
50            match self.outer {
51                Some(ref outer) => outer.get(name),
52                None => None,
53            }
54        }
55    }
56}
57
58pub type Store = HashMap<String, object::Object>;