use rskit_ai::ToolResultBlock;
use serde::{Deserialize, Serialize};
use crate::io::{ToolMetadata, ToolOutput};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolResult {
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<ToolOutput>,
#[serde(default)]
pub content: String,
#[serde(default)]
pub is_error: bool,
#[serde(skip_serializing_if = "ToolMetadata::is_empty", default)]
pub metadata: ToolMetadata,
}
impl ToolResult {
pub fn text(&self) -> &str {
&self.content
}
pub fn to_block(&self, id: &str) -> ToolResultBlock {
ToolResultBlock {
id: id.to_string(),
content: self.content.clone(),
is_error: self.is_error,
}
}
pub fn set_meta(&mut self, key: &str, value: ToolOutput) {
self.metadata.insert(key.to_string(), value);
}
}
pub fn text_result(content: &str) -> ToolResult {
ToolResult {
output: None,
content: content.to_string(),
is_error: false,
metadata: ToolMetadata::new(),
}
}
pub fn error_result(content: &str) -> ToolResult {
ToolResult {
output: None,
content: content.to_string(),
is_error: true,
metadata: ToolMetadata::new(),
}
}
pub fn json_result<T: Serialize>(value: &T) -> std::result::Result<ToolResult, serde_json::Error> {
let content = serde_json::to_string(value)?;
let json = serde_json::to_value(value)?;
Ok(ToolResult {
output: Some(ToolOutput::from(json)),
content,
is_error: false,
metadata: ToolMetadata::new(),
})
}