use super::expression_tracked_values::ExpressionObjectKey;
use super::expression_variant::ExpressionVariant;
#[derive(Clone, Copy, Default)]
pub struct ExpressionEvaluationContext<'a> {
pub starting_value: ExpressionVariant,
pub current_value: ExpressionVariant,
pub final_value: ExpressionVariant,
pub target: Option<&'a dyn IExpressionObject>,
pub parameters: Option<&'a dyn IExpressionParameterCollection>,
pub foreign_function_interface: Option<&'a dyn IExpressionForeignFunctionInterface>,
}
pub trait IExpressionObject {
fn get_property(&self, name: &str) -> ExpressionVariant;
fn key(&self) -> ExpressionObjectKey {
ExpressionObjectKey(self as *const Self as *const () as usize)
}
}
pub trait IExpressionParameterCollection {
fn get_parameter(&self, name: &str) -> ExpressionVariant;
fn get_object_parameter(&self, name: &str) -> Option<&dyn IExpressionObject>;
}
pub trait IExpressionForeignFunctionInterface {
fn call(&self, name: &str, arguments: &[ExpressionVariant]) -> Option<ExpressionVariant>;
}