| use crate::value::Value; |
| use std::collections::HashMap; |
| use std::ops::{Deref, DerefMut}; |
|
|
| |
| pub trait ValueProvider { |
| fn get_value(&self, name: &str) -> Option<Value>; |
| } |
|
|
| pub trait FunctionProvider { |
| fn run_function(&self, name: &str, args: &[Value]) -> Option<Value>; |
| } |
|
|
| pub struct ValueMap(HashMap<String, Value>); |
|
|
| pub struct NothingMap; |
|
|
| impl ValueProvider for &ValueMap { |
| fn get_value(&self, name: &str) -> Option<Value> { |
| self.0.get(name).cloned() |
| } |
| } |
|
|
| impl ValueProvider for NothingMap { |
| fn get_value(&self, _: &str) -> Option<Value> { |
| None |
| } |
| } |
|
|
| impl ValueProvider for ValueMap { |
| fn get_value(&self, name: &str) -> Option<Value> { |
| self.0.get(name).cloned() |
| } |
| } |
|
|
| impl Deref for ValueMap { |
| type Target = HashMap<String, Value>; |
| fn deref(&self) -> &Self::Target { |
| &self.0 |
| } |
| } |
| impl DerefMut for ValueMap { |
| fn deref_mut(&mut self) -> &mut Self::Target { |
| &mut self.0 |
| } |
| } |
|
|
| impl FunctionProvider for NothingMap { |
| fn run_function(&self, _: &str, _: &[Value]) -> Option<Value> { |
| None |
| } |
| } |
|
|
| pub struct EvalContext<V: ValueProvider, F: FunctionProvider> { |
| values: V, |
| functions: F, |
| } |
|
|
| impl Default for EvalContext<NothingMap, NothingMap> { |
| fn default() -> Self { |
| Self { |
| values: NothingMap, |
| functions: NothingMap, |
| } |
| } |
| } |
|
|
| impl<V: ValueProvider, F: FunctionProvider> EvalContext<V, F> { |
| pub fn new(values: V, functions: F) -> Self { |
| Self { values, functions } |
| } |
|
|
| pub fn get_value(&self, name: &str) -> Option<Value> { |
| self.values.get_value(name) |
| } |
|
|
| pub fn run_function(&self, name: &str, args: &[Value]) -> Option<Value> { |
| self.functions.run_function(name, args) |
| } |
| } |
|
|