use reifydb_type::value::{Value, frame::frame::Frame, r#type::Type};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseFrame {
pub row_numbers: Vec<u64>,
pub columns: Vec<ResponseColumn>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseColumn {
pub name: String,
#[serde(rename = "type")]
pub r#type: Type,
pub payload: Vec<String>,
}
pub fn convert_frames(frames: &[Frame]) -> Vec<ResponseFrame> {
let mut result = Vec::new();
for frame in frames {
let row_numbers: Vec<u64> = frame.row_numbers.iter().map(|rn| rn.value()).collect();
let mut columns = Vec::new();
for column in frame.iter() {
let column_data: Vec<String> = column
.data
.iter()
.map(|value| match value {
Value::None {
..
} => "⟪none⟫".to_string(),
Value::Blob(b) => b.to_hex(),
_ => value.to_string(),
})
.collect();
columns.push(ResponseColumn {
name: column.name.clone(),
r#type: column.data.get_type(),
payload: column_data,
});
}
result.push(ResponseFrame {
row_numbers,
columns,
});
}
result
}