Skip to main content

acp_cli/output/
json.rs

1use std::io::{self, Write};
2
3use serde_json::json;
4
5use super::OutputRenderer;
6
7pub struct JsonRenderer;
8
9impl JsonRenderer {
10    pub fn new() -> Self {
11        Self
12    }
13
14    fn emit(&self, value: serde_json::Value) {
15        let line = serde_json::to_string(&value).expect("failed to serialize JSON output");
16        println!("{line}");
17        let _ = io::stdout().flush();
18    }
19}
20
21impl Default for JsonRenderer {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl OutputRenderer for JsonRenderer {
28    fn text_chunk(&mut self, text: &str) {
29        self.emit(json!({"type": "text", "content": text}));
30    }
31
32    fn tool_status(&mut self, tool: &str) {
33        self.emit(json!({"type": "tool", "name": tool}));
34    }
35
36    fn permission_denied(&mut self, tool: &str) {
37        self.emit(json!({"type": "error", "message": format!("permission denied: {tool}")}));
38    }
39
40    fn error(&mut self, err: &str) {
41        self.emit(json!({"type": "error", "message": err}));
42    }
43
44    fn session_info(&mut self, id: &str) {
45        self.emit(json!({"type": "session", "sessionId": id}));
46    }
47
48    fn done(&mut self) {
49        self.emit(json!({"type": "done"}));
50    }
51}