harn-vm 0.10.125

Async bytecode virtual machine for the Harn programming language
Documentation
use crate::stdlib::macros::{harn_builtin, register_builtin_defs, VmBuiltinDef};
use crate::value::{VmError, VmValue};
use crate::vm::Vm;

pub(crate) fn register_tool_projection_builtins(vm: &mut Vm) {
    register_builtin_defs(vm, MODULE_BUILTINS);
}

#[harn_builtin(
    exposure = "pure",
    effects = [],
    sig = "tool_project(registry: {_type: \"tool_registry\", tools: list} | list, audience: \"cli\" | \"mcp\" | \"catalog\" | \"dashboard\" | \"agent\") -> {_type: \"tool_registry\", tools: list} | list",
    category = "tools"
)]
fn tool_project_impl(args: &[VmValue], _out: &mut String) -> Result<VmValue, VmError> {
    let Some(registry) = args.first() else {
        return Err(VmError::Thrown(VmValue::String(arcstr::ArcStr::from(
            "tool_project: requires a registry and audience",
        ))));
    };
    let audience = match args.get(1) {
        Some(VmValue::String(value)) => crate::tool_registry::ToolAudience::parse(value),
        _ => None,
    }
    .ok_or_else(|| {
        VmError::Thrown(VmValue::String(arcstr::ArcStr::from(
            "tool_project: audience must be one of \"cli\", \"mcp\", \"catalog\", \"dashboard\", or \"agent\"",
        )))
    })?;
    crate::tool_registry::project_tools_for_audience(registry, audience).map_err(|error| {
        VmError::Thrown(VmValue::String(arcstr::ArcStr::from(format!(
            "tool_project: {error}"
        ))))
    })
}

const MODULE_BUILTINS: &[&VmBuiltinDef] = &[&TOOL_PROJECT_IMPL_DEF];