Skip to main content

reifydb_core/value/frame/
response.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::value::{Value, frame::frame::Frame, r#type::Type};
5use serde::{Deserialize, Serialize};
6
7/// A response frame containing query/command results.
8#[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/// A column in a response frame.
17#[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
25/// Convert database result frames to response frames.
26///
27/// This function converts the internal `Frame` type to the serializable
28/// `ResponseFrame` type expected by clients.
29pub 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}