From 8b44af08baa60e66966e3c4cebbbb0c1aef37acf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= <tseeker@nocternity.net>
Date: Sat, 31 Dec 2022 15:57:54 +0100
Subject: [PATCH] Interpreter - Initial environment implementation

---
 src/interpreter/environment.rs | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/interpreter/environment.rs b/src/interpreter/environment.rs
index e69de29..6b35d98 100644
--- a/src/interpreter/environment.rs
+++ b/src/interpreter/environment.rs
@@ -0,0 +1,29 @@
+use std::collections::HashMap;
+
+use crate::{errors::InterpreterError, tokens::Token};
+
+use super::Value;
+
+/// The execution environment.
+#[derive(Debug, Default)]
+pub struct Environment {
+    values: HashMap<String, Value>,
+}
+
+impl Environment {
+    /// Define a new variable.
+    pub fn define(&mut self, name: String, value: Value) {
+        self.values.insert(name, value);
+    }
+
+    /// Get the value of a variable.
+    pub fn get(&self, name: &Token) -> Result<Value, InterpreterError> {
+        match self.values.get(&name.lexeme as &str) {
+            None => Err(InterpreterError::new(
+                name,
+                &format!("undefined variable '{}'", name.lexeme),
+            )),
+            Some(value) => Ok(value.clone()),
+        }
+    }
+}