soma_codemode/preamble/
catalog.rs1use 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}