Skip to main content

reifydb_codec/json/
to.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}