1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::collections::HashMap;

use def::Def;
use parse::{Block,SrcBlock};
use var::Var;
use fun::Fun;

impl Env {
    pub fn def_contains(def: &Def, path: Option<Vec<&str>>, lookup: &str) -> bool {
        if let Some(path) = path {
            if let Some(ref def) = def.get(path[0]) {
                return def.data.contains_key(lookup)
            }
        }

        false
    }

    pub fn empty () -> Env {
        Env { src: HashMap::new(), def: HashMap::new(), fun: HashMap::new() }
    }

    pub fn insert (&mut self, mut v: Vec<Block>) {
        for b in v.drain(..) {
            match b {
                Block::Def(db) => {
                    self.def.insert(db.name.clone(), db);
                },
                Block::Src(sb) => {
                    self.src.insert(sb.name.clone(), sb);
                },
            }
        }
    }

    pub fn insert_var (&mut self, block: &str, name: String, var: Var) -> Option<Var> {
        if let Some(b) = self.def.get_mut(block) {
            return b.data.insert(name, var)
        }

        None
    }
}

/// Environment containing all parsed definition and source blocks
pub struct Env {
    pub def: Def,
    pub src: HashMap<String, SrcBlock>,
    pub fun: HashMap<String, Fun>,
}