Skip to content

Commit be1684f

Browse files
authored
Merge pull request eclipse-score#46 from qorix-group/vinod_support_basic_types
2 parents 3efbb0e + afefa8a commit be1684f

File tree

8 files changed

+407
-97
lines changed

8 files changed

+407
-97
lines changed

src/rust/rust_kvs/src/json_backend.rs

Lines changed: 108 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,134 @@
1+
// Copyright (c) 2025 Contributors to the Eclipse Foundation
2+
//
3+
// See the NOTICE file(s) distributed with this work for additional
4+
// information regarding copyright ownership.
5+
//
6+
// This program and the accompanying materials are made available under the
7+
// terms of the Apache License Version 2.0 which is available at
8+
// <https://www.apache.org/licenses/LICENSE-2.0>
9+
//
10+
// SPDX-License-Identifier: Apache-2.0
11+
112
use crate::error_code::ErrorCode;
213
use crate::kvs_backend::KvsBackend;
314
use crate::kvs_value::{KvsMap, KvsValue};
415
use std::fs;
516
use std::path::PathBuf;
617

18+
// for creating jsonvalue obj
19+
use std::collections::HashMap;
20+
721
use tinyjson::{JsonGenerateError, JsonParseError, JsonValue};
822

23+
// Example of how KvsValue is stored in the JSON file (t-tagged format):
24+
// {
25+
// "my_int": { "t": "i32", "v": 42 },
26+
// "my_float": { "t": "f64", "v": 3.1415 },
27+
// "my_bool": { "t": "bool", "v": true },
28+
// "my_string": { "t": "str", "v": "hello" },
29+
// "my_array": { "t": "arr", "v": [ ... ] },
30+
// "my_object": { "t": "obj", "v": { ... } },
31+
// "my_null": { "t": "null", "v": null }
32+
// }
33+
934
/// Backend-specific JsonValue -> KvsValue conversion.
1035
impl From<JsonValue> for KvsValue {
1136
fn from(val: JsonValue) -> KvsValue {
1237
match val {
13-
JsonValue::Number(n) => KvsValue::Number(n),
14-
JsonValue::Boolean(b) => KvsValue::Boolean(b),
15-
JsonValue::String(s) => KvsValue::String(s),
16-
JsonValue::Null => KvsValue::Null,
17-
JsonValue::Array(arr) => KvsValue::Array(arr.into_iter().map(KvsValue::from).collect()),
18-
JsonValue::Object(obj) => KvsValue::Object(
19-
obj.into_iter()
20-
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
21-
.collect(),
22-
),
38+
JsonValue::Object(mut obj) => {
39+
// Type-tagged: { "t": ..., "v": ... }
40+
if let (Some(JsonValue::String(type_str)), Some(value)) =
41+
(obj.remove("t"), obj.remove("v"))
42+
{
43+
return match (type_str.as_str(), value) {
44+
("i32", JsonValue::Number(v)) => KvsValue::I32(v as i32),
45+
("u32", JsonValue::Number(v)) => KvsValue::U32(v as u32),
46+
("i64", JsonValue::Number(v)) => KvsValue::I64(v as i64),
47+
("u64", JsonValue::Number(v)) => KvsValue::U64(v as u64),
48+
("f64", JsonValue::Number(v)) => KvsValue::F64(v),
49+
("bool", JsonValue::Boolean(v)) => KvsValue::Boolean(v),
50+
("str", JsonValue::String(v)) => KvsValue::String(v),
51+
("null", JsonValue::Null) => KvsValue::Null,
52+
("arr", JsonValue::Array(v)) => {
53+
KvsValue::Array(v.into_iter().map(KvsValue::from).collect())
54+
}
55+
("obj", JsonValue::Object(v)) => KvsValue::Object(
56+
v.into_iter().map(|(k, v)| (k, KvsValue::from(v))).collect(),
57+
),
58+
// Remaining types can be handled with Null.
59+
_ => KvsValue::Null,
60+
};
61+
}
62+
// If not a t-tagged object, treat as a map of key-value pairs (KvsMap)
63+
let map: KvsMap = obj
64+
.into_iter()
65+
.map(|(k, v)| (k, KvsValue::from(v)))
66+
.collect();
67+
KvsValue::Object(map)
68+
}
69+
// Remaining types can be handled with Null.
70+
_ => KvsValue::Null,
2371
}
2472
}
2573
}
2674

2775
/// Backend-specific KvsValue -> JsonValue conversion.
2876
impl From<KvsValue> for JsonValue {
2977
fn from(val: KvsValue) -> JsonValue {
78+
let mut obj = HashMap::new();
3079
match val {
31-
KvsValue::Number(n) => JsonValue::Number(n),
32-
KvsValue::Boolean(b) => JsonValue::Boolean(b),
33-
KvsValue::String(s) => JsonValue::String(s),
34-
KvsValue::Null => JsonValue::Null,
80+
KvsValue::I32(n) => {
81+
obj.insert("t".to_string(), JsonValue::String("i32".to_string()));
82+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
83+
}
84+
KvsValue::U32(n) => {
85+
obj.insert("t".to_string(), JsonValue::String("u32".to_string()));
86+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
87+
}
88+
KvsValue::I64(n) => {
89+
obj.insert("t".to_string(), JsonValue::String("i64".to_string()));
90+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
91+
}
92+
KvsValue::U64(n) => {
93+
obj.insert("t".to_string(), JsonValue::String("u64".to_string()));
94+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
95+
}
96+
KvsValue::F64(n) => {
97+
obj.insert("t".to_string(), JsonValue::String("f64".to_string()));
98+
obj.insert("v".to_string(), JsonValue::Number(n));
99+
}
100+
KvsValue::Boolean(b) => {
101+
obj.insert("t".to_string(), JsonValue::String("bool".to_string()));
102+
obj.insert("v".to_string(), JsonValue::Boolean(b));
103+
}
104+
KvsValue::String(s) => {
105+
obj.insert("t".to_string(), JsonValue::String("str".to_string()));
106+
obj.insert("v".to_string(), JsonValue::String(s));
107+
}
108+
KvsValue::Null => {
109+
obj.insert("t".to_string(), JsonValue::String("null".to_string()));
110+
obj.insert("v".to_string(), JsonValue::Null);
111+
}
35112
KvsValue::Array(arr) => {
36-
JsonValue::Array(arr.into_iter().map(JsonValue::from).collect())
113+
obj.insert("t".to_string(), JsonValue::String("arr".to_string()));
114+
obj.insert(
115+
"v".to_string(),
116+
JsonValue::Array(arr.into_iter().map(JsonValue::from).collect()),
117+
);
118+
}
119+
KvsValue::Object(map) => {
120+
obj.insert("t".to_string(), JsonValue::String("obj".to_string()));
121+
obj.insert(
122+
"v".to_string(),
123+
JsonValue::Object(
124+
map.into_iter()
125+
.map(|(k, v)| (k, JsonValue::from(v)))
126+
.collect(),
127+
),
128+
);
37129
}
38-
KvsValue::Object(map) => JsonValue::Object(
39-
map.into_iter()
40-
.map(|(k, v)| (k.clone(), JsonValue::from(v)))
41-
.collect(),
42-
),
43130
}
131+
JsonValue::Object(obj)
44132
}
45133
}
46134

0 commit comments

Comments
 (0)