diff options
Diffstat (limited to 'src/environment.rs')
-rw-r--r-- | src/environment.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/environment.rs b/src/environment.rs new file mode 100644 index 0000000..006b45b --- /dev/null +++ b/src/environment.rs @@ -0,0 +1,63 @@ +use crate::*; + +use std::collections::HashMap; + + +pub struct Environment { + pub scopes: Vec<Scope>, +} + +impl Environment { + pub fn get_integer(&self, name: &str) -> Result<usize, ()> { + for scope in self.scopes.iter().rev() { + if let Ok(value) = scope.get_integer(name, &self) { + return Ok(value); + } + } + return Err(()); + } + + pub fn get_block(&self, name: &str) -> Result<usize, ()> { + for scope in self.scopes.iter().rev() { + if let Ok(value) = scope.get_block(name, &self) { + return Ok(value); + } + } + return Err(()); + } +} + +pub struct Scope { + pub definitions: HashMap<String, Definition>, +} + +impl Scope { + pub fn get_integer(&self, name: &str, environment: &Environment) -> Result<usize, ()> { + use IntegerDefinition as IntDef; + if let Some(definition) = self.definitions.get(name) { + if let Definition::Integer(integer) = definition { + match integer { + IntDef::Literal(value) => return Ok(*value), + IntDef::ConstantExpression(expr) => match expr.evaluate(environment) { + Ok(_) | Err(_) => todo!(), + }, + }; + } + } + return Err(()); + } + + pub fn get_block(&self, _name: &str, _environment: &Environment) -> Result<usize, ()> { + todo!() + } +} + +pub enum Definition { + Integer(IntegerDefinition), + Block(BlockLiteral), +} + +pub enum IntegerDefinition { + Literal(usize), + ConstantExpression(ConstantExpression), +} |