use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct ToolResultDisplay {
#[serde(default, skip_serializing, skip_deserializing)]
pub edit_diff: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ToolResult {
pub tool_name: String,
pub success: bool,
pub content: String,
pub metadata: Value,
#[serde(default, skip_serializing, skip_deserializing)]
pub display: ToolResultDisplay,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_diff_never_enters_serialized_or_hydrated_tool_result() {
let result = ToolResult {
tool_name: "hash_edit".to_string(),
success: true,
content: "raw result".to_string(),
metadata: serde_json::json!({"files_changed": 1}),
display: ToolResultDisplay {
edit_diff: Some("SECRET DISPLAY DIFF".to_string()),
},
};
let serialized = serde_json::to_string(&result).unwrap();
assert!(!serialized.contains("display"), "{serialized}");
assert!(!serialized.contains("SECRET DISPLAY DIFF"), "{serialized}");
let hydrated: ToolResult = serde_json::from_str(&serialized).unwrap();
assert_eq!(hydrated.content, "raw result");
assert_eq!(hydrated.display, ToolResultDisplay::default());
}
}