Skip to main content

soma_codemode/preamble/
catalog.rs

1use std::collections::BTreeMap;
2
3use crate::types::ToolDescriptor;
4
5use super::names::{namespace_segment, tool_name_to_snake};
6
7pub fn generate_js_proxy_from_catalog(entries: &[ToolDescriptor]) -> Result<String, String> {
8    let mut namespaces: BTreeMap<String, Vec<&ToolDescriptor>> = BTreeMap::new();
9    for entry in entries {
10        namespaces
11            .entry(entry.namespace.clone())
12            .or_default()
13            .push(entry);
14    }
15    let mut out = String::from("globalThis.codemode = globalThis.codemode || {};\n");
16    out.push_str("var codemode = globalThis.codemode;\n");
17    for (namespace, tools) in namespaces {
18        let ns = namespace_segment(&namespace);
19        out.push_str(&format!("codemode.{ns} = codemode.{ns} || {{}};\n"));
20        for tool in tools {
21            let name = tool_name_to_snake(&tool.name);
22            let id = serde_json::to_string(&tool.id).map_err(|err| err.to_string())?;
23            out.push_str(&format!(
24                "codemode.{ns}.{name} = (params = {{}}) => callTool({id}, params);\n"
25            ));
26        }
27    }
28    Ok(out)
29}