Skip to main content

soma_gateway/gateway/
code_mode.rs

1use 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;