use crate::ext::describe::Execution;
use crate::ext::errors::ExtensionError;
use crate::ext::registry::ExtensionRegistry;
#[derive(Debug, Clone)]
pub struct RenderedArtifact {
pub filename: String,
pub bytes: Vec<u8>,
pub sha256: String,
}
pub fn invoke_recipe(
registry: &ExtensionRegistry,
extension_id: &str,
recipe_id: &str,
_config_json: &str,
_session_json: &str,
) -> Result<RenderedArtifact, ExtensionError> {
let entry = registry.resolve(extension_id, recipe_id)?;
match &entry.execution {
Execution::Wasm => Err(ExtensionError::ModeBNotImplemented),
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ext::describe::Descriptor;
use crate::ext::loader::DiscoveredExtension;
use std::path::PathBuf;
fn register(reg: &mut ExtensionRegistry, kind_json: &str) {
let raw = format!(
r#"{{
"apiVersion": "greentic.ai/v1",
"kind": "BundleExtension",
"metadata": {{ "id": "x.test", "name": "t", "version": "0.0.1" }},
"runtime": {{ "component": "extension.wasm" }},
"execution": {kind_json},
"contributions": {{
"recipes": [
{{ "id": "standard", "displayName": "x", "description": "x",
"configSchema": "s.json" }}
]
}}
}}"#
);
let d = Descriptor::from_json(&raw).unwrap();
let discovered = DiscoveredExtension {
root: PathBuf::from("/tmp"),
descriptor: d,
};
reg.register_discovered(vec![discovered]).unwrap();
}
#[test]
fn wasm_dispatch_returns_not_implemented() {
let mut reg = ExtensionRegistry::new();
register(&mut reg, r#"{ "kind": "wasm" }"#);
let err = invoke_recipe(®, "x.test", "standard", "{}", "{}").unwrap_err();
assert!(
matches!(err, ExtensionError::ModeBNotImplemented),
"expected ModeBNotImplemented, got {err:?}"
);
}
#[test]
fn unknown_extension_errors() {
let reg = ExtensionRegistry::new();
let err = invoke_recipe(®, "x.missing", "standard", "{}", "{}").unwrap_err();
assert!(matches!(err, ExtensionError::RecipeNotFound { .. }));
}
}