Skip to main content

reifydb_value/value/
json.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use serde_json::{Map, Value as JsonValue};
5
6use super::Value;
7use crate::util::hex::encode;
8
9impl Value {
10	pub fn to_json_value(&self) -> JsonValue {
11		match self {
12			Value::None {
13				..
14			} => JsonValue::Null,
15			Value::Boolean(b) => JsonValue::Bool(*b),
16			Value::Int1(i) => JsonValue::String(i.to_string()),
17			Value::Int2(i) => JsonValue::String(i.to_string()),
18			Value::Int4(i) => JsonValue::String(i.to_string()),
19			Value::Int8(i) => JsonValue::String(i.to_string()),
20			Value::Int16(i) => JsonValue::String(i.to_string()),
21			Value::Uint1(u) => JsonValue::String(u.to_string()),
22			Value::Uint2(u) => JsonValue::String(u.to_string()),
23			Value::Uint4(u) => JsonValue::String(u.to_string()),
24			Value::Uint8(u) => JsonValue::String(u.to_string()),
25			Value::Uint16(u) => JsonValue::String(u.to_string()),
26			Value::Float4(f) => {
27				let v: f32 = **f;
28				if v.is_finite() {
29					JsonValue::String(f.to_string())
30				} else {
31					JsonValue::Null
32				}
33			}
34			Value::Float8(f) => {
35				let v: f64 = **f;
36				if v.is_finite() {
37					JsonValue::String(f.to_string())
38				} else {
39					JsonValue::Null
40				}
41			}
42			Value::Utf8(s) => JsonValue::String(s.clone()),
43			Value::Decimal(d) => JsonValue::String(d.to_string()),
44			Value::Uuid4(u) => JsonValue::String(u.to_string()),
45			Value::Uuid7(u) => JsonValue::String(u.to_string()),
46			Value::IdentityId(id) => JsonValue::String(id.to_string()),
47			Value::Date(d) => JsonValue::String(d.to_string()),
48			Value::DateTime(dt) => JsonValue::String(dt.to_string()),
49			Value::Time(t) => JsonValue::String(t.to_string()),
50			Value::Duration(d) => JsonValue::String(d.to_iso_string()),
51			Value::Blob(b) => JsonValue::String(b.to_string()),
52			Value::DictionaryId(id) => JsonValue::String(id.to_string()),
53			Value::Type(t) => JsonValue::String(t.to_string()),
54			Value::Any(v) => v.to_json_value(),
55			Value::List(items) => JsonValue::Array(items.iter().map(|v| v.to_json_value()).collect()),
56			Value::Record(fields) => {
57				let map: Map<String, JsonValue> =
58					fields.iter().map(|(k, v)| (k.clone(), v.to_json_value())).collect();
59				JsonValue::Object(map)
60			}
61			Value::Tuple(items) => JsonValue::Array(items.iter().map(|v| v.to_json_value()).collect()),
62			Value::Digest(digest) => JsonValue::String(format!("0x{}", encode(&digest.encode()))),
63		}
64	}
65}