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
17		let mut columns = Vec::new();
18
19		for column in frame.iter() {
20			let column_data: Vec<String> = column
21				.data
22				.iter()
23				.map(|value| match value {
24					Value::None {
25						..
26					} => "⟪none⟫".to_string(),
27					Value::Blob(b) => b.to_hex(),
28					_ => value.to_string(),
29				})
30				.collect();
31
32			columns.push(ResponseColumn {
33				name: column.name.clone(),
34				r#type: column.data.get_type(),
35				payload: column_data,
36			});
37		}
38
39		result.push(ResponseFrame {
40			row_numbers,
41			created_at,
42			updated_at,
43			columns,
44		});
45	}
46
47	result
48}
49
50pub fn frames_to_json(frames: &[Frame]) -> Result<String, Error> {
51	let response_frames = convert_frames(frames);
52	to_string(&response_frames)
53}