1use serde_json::Error as JsonError;
2
3use super::messages::A2uiMessage;
4
5pub fn encode_message_line(message: &A2uiMessage) -> Result<String, JsonError> {
7 let mut line = serde_json::to_string(message)?;
8 line.push('\n');
9 Ok(line)
10}
11
12pub fn encode_jsonl<I>(messages: I) -> Result<String, JsonError>
14where
15 I: IntoIterator<Item = A2uiMessage>,
16{
17 let mut output = String::new();
18 for message in messages {
19 output.push_str(&serde_json::to_string(&message)?);
20 output.push('\n');
21 }
22 Ok(output)
23}
24
25pub fn encode_jsonl_bytes<I>(messages: I) -> Result<Vec<u8>, JsonError>
27where
28 I: IntoIterator<Item = A2uiMessage>,
29{
30 Ok(encode_jsonl(messages)?.into_bytes())
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36 use crate::a2ui::messages::{
37 A2uiMessage, CreateSurface, CreateSurfaceMessage, DeleteSurface, DeleteSurfaceMessage,
38 };
39
40 #[test]
41 fn encodes_single_line_with_newline() {
42 let message = A2uiMessage::CreateSurface(CreateSurfaceMessage {
43 create_surface: CreateSurface {
44 surface_id: "main".to_string(),
45 catalog_id: "catalog".to_string(),
46 theme: None,
47 send_data_model: None,
48 },
49 });
50
51 let line = encode_message_line(&message).unwrap();
52 assert!(line.ends_with('\n'));
53
54 let value: serde_json::Value = serde_json::from_str(line.trim()).unwrap();
55 assert_eq!(value["createSurface"]["surfaceId"], "main");
56 }
57
58 #[test]
59 fn encodes_multiple_messages_as_jsonl() {
60 let create = A2uiMessage::CreateSurface(CreateSurfaceMessage {
61 create_surface: CreateSurface {
62 surface_id: "main".to_string(),
63 catalog_id: "catalog".to_string(),
64 theme: None,
65 send_data_model: None,
66 },
67 });
68 let delete = A2uiMessage::DeleteSurface(DeleteSurfaceMessage {
69 delete_surface: DeleteSurface { surface_id: "main".to_string() },
70 });
71
72 let jsonl = encode_jsonl(vec![create, delete]).unwrap();
73 let lines: Vec<&str> = jsonl.trim_end().split('\n').collect();
74 assert_eq!(lines.len(), 2);
75 }
76}