use crate::{ActPackageDefinition, Principal, Result, env::ActUserVar, scheduler::Runtime};
use std::sync::Arc;
pub(crate) const REGISTER_VAR: &str = "ext:register_var";
pub(crate) const REGISTER_PACKAGE: &str = "pack:publish";
#[derive(Clone)]
pub struct ExtExecutor {
runtime: Arc<Runtime>,
principal: Arc<Principal>,
}
impl ExtExecutor {
pub(crate) fn new(rt: &Arc<Runtime>, principal: &Arc<Principal>) -> Self {
Self {
runtime: rt.clone(),
principal: principal.clone(),
}
}
pub fn register_var<T: ActUserVar + Clone + 'static>(&self, module: &T) -> Result<()> {
self.principal.check(REGISTER_VAR)?;
self.runtime.env().register_var(module);
Ok(())
}
pub async fn register_package(&self, def: &ActPackageDefinition) -> Result<()> {
self.principal.check(REGISTER_PACKAGE)?;
let package = def.into_data()?;
let ret = self.runtime.cache().store().publish(&package).await?;
if ret {
self.runtime.schema_cache().invalidate_package(&package.id);
}
Ok(())
}
}