use crate::*; use std::collections::HashMap; pub struct Environment { pub scopes: Vec, } impl Environment { pub fn get_integer(&self, name: &str) -> Result { 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 { 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, } impl Scope { pub fn get_integer(&self, name: &str, environment: &Environment) -> Result { 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 { todo!() } } pub enum Definition { Integer(IntegerDefinition), Block, } pub enum IntegerDefinition { Literal(usize), ConstantExpression(ConstantExpression), }