soma_gateway/gateway/
code_mode.rs1use serde_json::Value;
2use thiserror::Error;
3
4pub mod catalog;
5pub mod host;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct CodeModeToolId {
9 pub namespace: String,
10 pub tool: String,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq)]
14pub struct GatewayCodeModeError {
15 pub kind: String,
16 pub message: String,
17}
18
19#[derive(Debug, Error, PartialEq, Eq)]
20pub enum CodeModeError {
21 #[error("tool id must be namespace::tool")]
22 InvalidToolId,
23 #[error("params must be a JSON object")]
24 ParamsMustBeObject,
25 #[error("{kind}: {message}")]
26 Gateway { kind: String, message: String },
27}
28
29#[must_use]
30pub fn namespace_tool_id(namespace: &str, tool: &str) -> String {
31 soma_codemode::namespaced_tool_id(namespace, tool)
32}
33
34pub fn parse_namespace_tool_id(id: &str) -> Result<CodeModeToolId, CodeModeError> {
35 let Some((namespace, tool)) = soma_codemode::split_namespaced_id(id) else {
36 return Err(CodeModeError::InvalidToolId);
37 };
38 Ok(CodeModeToolId {
39 namespace: namespace.to_owned(),
40 tool: tool.to_owned(),
41 })
42}
43
44pub fn ensure_object_params(params: &Value) -> Result<(), CodeModeError> {
45 if params.is_object() {
46 return Ok(());
47 }
48 Err(CodeModeError::ParamsMustBeObject)
49}
50
51pub fn preserve_gateway_error(error: GatewayCodeModeError) -> CodeModeError {
52 CodeModeError::Gateway {
53 kind: error.kind,
54 message: error.message,
55 }
56}
57
58#[cfg(test)]
59#[path = "code_mode_tests.rs"]
60mod tests;