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, diff_type::DiffType, 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			op: frame.op.map(DiffType::as_u8),
42			row_numbers,
43			created_at,
44			updated_at,
45			time,
46			columns,
47		});
48	}
49
50	result
51}
52
53pub fn frames_to_json(frames: &[Frame]) -> Result<String, Error> {
54	let response_frames = convert_frames(frames);
55	to_string(&response_frames)
56}