1use serde::{Deserialize, Serialize};
5
6use crate::agent::spec::AgentKind;
7
8#[derive(Debug, Clone, Serialize)]
10pub struct DetectedAgent {
11 pub kind: AgentKind,
13 pub binary: String,
15 pub version: AgentVersion,
17}
18
19#[derive(Debug, Clone, Serialize)]
21pub struct AgentVersion {
22 pub version: Option<String>,
25 pub raw: String,
27}
28
29#[derive(Debug, Clone, Serialize)]
31pub struct AgentRun {
32 pub kind: AgentKind,
34 pub is_error: bool,
36 pub result: String,
38 pub raw: serde_json::Value,
41}
42
43#[derive(Debug, Clone, Deserialize)]
46pub struct ClaudeResult {
47 #[serde(default)]
49 pub result: String,
50 #[serde(default)]
52 pub is_error: bool,
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58
59 #[test]
60 fn deserializes_claude_result() {
61 let json = r#"{"type":"result","is_error":false,"result":"hello","total_cost_usd":0.01}"#;
62 let parsed: ClaudeResult = serde_json::from_str(json).unwrap();
63 assert!(!parsed.is_error);
64 assert_eq!(parsed.result, "hello");
65 }
66
67 #[test]
68 fn claude_result_defaults_missing_fields() {
69 let parsed: ClaudeResult = serde_json::from_str("{}").unwrap();
70 assert!(!parsed.is_error);
71 assert_eq!(parsed.result, "");
72 }
73
74 #[test]
75 fn agent_run_serializes_to_json() {
76 let run = AgentRun {
77 kind: AgentKind::Claude,
78 is_error: false,
79 result: "hi".into(),
80 raw: serde_json::json!({"result": "hi"}),
81 };
82 let serialized = serde_json::to_string(&run).unwrap();
83 assert!(serialized.contains("\"kind\":\"claude\""));
84 assert!(serialized.contains("\"result\":\"hi\""));
85 assert!(serialized.contains("\"is_error\":false"));
86 }
87
88 #[test]
89 fn detected_agent_serializes() {
90 let detected = DetectedAgent {
91 kind: AgentKind::Claude,
92 binary: "claude".into(),
93 version: AgentVersion {
94 version: Some("1.2.3".into()),
95 raw: "1.2.3 (Claude Code)".into(),
96 },
97 };
98 let serialized = serde_json::to_string(&detected).unwrap();
99 assert!(serialized.contains("\"binary\":\"claude\""));
100 assert!(serialized.contains("\"version\":\"1.2.3\""));
101 }
102}