use super::utils::DslUtils;
use crate::application::engine::ExecutionContext;
use crate::domain::resource::{PackageResource, Resource};
use rhai::{Engine, Map, Module, NativeCallContext};
pub fn register(engine: &mut Engine) {
let mut module = Module::new();
module.set_native_fn("version", || Ok(env!("CARGO_PKG_VERSION").to_string()));
module.set_native_fn(
"pkg",
move |ctx: NativeCallContext, name: String, params: Map| {
let exec_ctx = ExecutionContext::get_current();
let ensure = DslUtils::extract_ensure(¶ms);
let dependencies =
DslUtils::extract_dependencies(¶ms, &exec_ctx, ctx.call_source());
let provider = DslUtils::extract_string(¶ms, "provider")
.unwrap_or_else(|| exec_ctx.get_default_provider());
let mutex =
DslUtils::extract_string(¶ms, "mutex").unwrap_or_else(|| provider.clone());
let resource = Resource::Package(PackageResource {
id: format!("Package[{}]", name),
name,
ensure,
provider,
dependencies,
mutex: Some(mutex),
source_context: exec_ctx.get_source_context(),
});
exec_ctx.add_resource(resource).map_err(|e| {
Box::new(rhai::EvalAltResult::ErrorRuntime(
e.to_string().into(),
rhai::Position::NONE,
))
})
},
);
let shared_module: std::sync::Arc<Module> = module.into();
engine.register_static_module("stdlib", shared_module.clone());
engine.register_static_module("std", shared_module);
}