use crate::collections::HashMap;
use crate::macros::{MacroContext, TokenStream};
use crate::runtime::{ConstValue, Stack, VmError};
use crate::Hash;
use std::fmt;
use std::sync::Arc;
pub(crate) type FunctionHandler = dyn Fn(&mut Stack, usize) -> Result<(), VmError> + Send + Sync;
pub(crate) type MacroHandler =
dyn Fn(&mut MacroContext, &TokenStream) -> crate::Result<TokenStream> + Send + Sync;
#[derive(Default, Clone)]
pub struct RuntimeContext {
functions: HashMap<Hash, Arc<FunctionHandler>>,
constants: HashMap<Hash, ConstValue>,
}
impl RuntimeContext {
pub(crate) fn new(
functions: HashMap<Hash, Arc<FunctionHandler>>,
constants: HashMap<Hash, ConstValue>,
) -> Self {
Self {
functions,
constants,
}
}
pub fn function(&self, hash: Hash) -> Option<&Arc<FunctionHandler>> {
self.functions.get(&hash)
}
pub fn constant(&self, hash: Hash) -> Option<&ConstValue> {
self.constants.get(&hash)
}
}
impl fmt::Debug for RuntimeContext {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "RuntimeContext")
}
}
#[cfg(test)]
static_assertions::assert_impl_all!(RuntimeContext: Send, Sync);