1use reifydb_value::value::{Value, frame::frame::Frame};
5use serde_json::{Error, to_string};
6
7use crate::json::types::{ResponseColumn, ResponseFrame};
8
9pub fn convert_frames(frames: &[Frame]) -> Vec<ResponseFrame> {
10 let mut result = Vec::new();
11
12 for frame in frames {
13 let row_numbers: Vec<u64> = frame.row_numbers().iter().map(|rn| rn.value()).collect();
14 let created_at: Vec<String> = frame.created_at().iter().map(|dt| dt.to_string()).collect();
15 let updated_at: Vec<String> = frame.updated_at().iter().map(|dt| dt.to_string()).collect();
16 let time: Vec<String> = frame.time().iter().map(|dt| dt.to_string()).collect();
17
18 let mut columns = Vec::new();
19
20 for column in frame.iter() {
21 let column_data: Vec<String> = column
22 .data
23 .iter()
24 .map(|value| match value {
25 Value::None {
26 ..
27 } => "⟪none⟫".to_string(),
28 Value::Blob(b) => b.to_hex(),
29 _ => value.to_string(),
30 })
31 .collect();
32
33 columns.push(ResponseColumn {
34 name: column.name.clone(),
35 r#type: column.data.get_type(),
36 payload: column_data,
37 });
38 }
39
40 result.push(ResponseFrame {
41 row_numbers,
42 created_at,
43 updated_at,
44 time,
45 columns,
46 });
47 }
48
49 result
50}
51
52pub fn frames_to_json(frames: &[Frame]) -> Result<String, Error> {
53 let response_frames = convert_frames(frames);
54 to_string(&response_frames)
55}