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>;