pub use turbomcp_core::response::{Image, IntoToolError, IntoToolResponse, Json, Text, ToolError};
#[derive(Debug)]
pub struct WorkerError(pub worker::Error);
impl From<WorkerError> for ToolError {
fn from(e: WorkerError) -> Self {
ToolError::new(e.0.to_string())
}
}
impl std::fmt::Display for WorkerError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
pub trait WorkerResultExt<T> {
fn into_tool_result(self) -> Result<T, ToolError>;
}
impl<T> WorkerResultExt<T> for worker::Result<T> {
fn into_tool_result(self) -> Result<T, ToolError> {
self.map_err(|e| ToolError::new(e.to_string()))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::wasm_server::types::ToolResult;
#[test]
fn test_string_into_response() {
let response = "hello".into_tool_response();
assert_eq!(response.content.len(), 1);
assert!(response.is_error.is_none());
}
#[test]
fn test_owned_string_into_response() {
let response = String::from("hello").into_tool_response();
assert_eq!(response.content.len(), 1);
}
#[test]
fn test_json_into_response() {
let data = serde_json::json!({"key": "value"});
let response = Json(data).into_tool_response();
assert_eq!(response.content.len(), 1);
}
#[test]
fn test_tool_error_into_response() {
let error = ToolError::new("something went wrong");
let response = error.into_tool_response();
assert_eq!(response.is_error, Some(true));
}
#[test]
fn test_result_ok_into_response() {
let result: Result<String, ToolError> = Ok("success".into());
let response = result.into_tool_response();
assert!(response.is_error.is_none());
}
#[test]
fn test_result_err_into_response() {
let result: Result<String, ToolError> = Err(ToolError::new("failed"));
let response = result.into_tool_response();
assert_eq!(response.is_error, Some(true));
}
#[test]
fn test_unit_into_response() {
let response = ().into_tool_response();
assert!(response.content.is_empty());
}
#[test]
fn test_option_some_into_response() {
let response = Some("value").into_tool_response();
assert_eq!(response.content.len(), 1);
}
#[test]
fn test_option_none_into_response() {
let response: ToolResult = None::<String>.into_tool_response();
assert_eq!(response.content.len(), 1);
}
#[test]
fn test_tuple_into_response() {
let response = ("first", "second").into_tool_response();
assert_eq!(response.content.len(), 2);
}
#[test]
fn test_text_wrapper() {
let response = Text("explicit text").into_tool_response();
assert_eq!(response.content.len(), 1);
}
#[test]
fn test_image_wrapper() {
let response = Image {
data: "base64data",
mime_type: "image/png",
}
.into_tool_response();
assert_eq!(response.content.len(), 1);
}
}