reifydb_core/value/frame/
response.rs1use reifydb_type::value::{Value, frame::frame::Frame, r#type::Type};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct ResponseFrame {
10 pub row_numbers: Vec<u64>,
11 pub created_at: Vec<String>,
12 pub updated_at: Vec<String>,
13 pub columns: Vec<ResponseColumn>,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct ResponseColumn {
19 pub name: String,
20 #[serde(rename = "type")]
21 pub r#type: Type,
22 pub payload: Vec<String>,
23}
24
25pub fn convert_frames(frames: &[Frame]) -> Vec<ResponseFrame> {
30 let mut result = Vec::new();
31
32 for frame in frames {
33 let row_numbers: Vec<u64> = frame.row_numbers.iter().map(|rn| rn.value()).collect();
34 let created_at: Vec<String> = frame.created_at.iter().map(|dt| dt.to_string()).collect();
35 let updated_at: Vec<String> = frame.updated_at.iter().map(|dt| dt.to_string()).collect();
36
37 let mut columns = Vec::new();
38
39 for column in frame.iter() {
40 let column_data: Vec<String> = column
41 .data
42 .iter()
43 .map(|value| match value {
44 Value::None {
45 ..
46 } => "⟪none⟫".to_string(),
47 Value::Blob(b) => b.to_hex(),
48 _ => value.to_string(),
49 })
50 .collect();
51
52 columns.push(ResponseColumn {
53 name: column.name.clone(),
54 r#type: column.data.get_type(),
55 payload: column_data,
56 });
57 }
58
59 result.push(ResponseFrame {
60 row_numbers,
61 created_at,
62 updated_at,
63 columns,
64 });
65 }
66
67 result
68}