Skip to content

Commit bfd259b

Browse files
committed
impl: fix the json format changes
- Fixed the parsing in backend - Fixed the tests
1 parent 9a09005 commit bfd259b

File tree

3 files changed

+103
-105
lines changed

3 files changed

+103
-105
lines changed

src/rust/rust_kvs/src/json_backend.rs

Lines changed: 35 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ use tinyjson::{JsonGenerateError, JsonParseError, JsonValue};
2222

2323
// Example of how KvsValue is stored in the JSON file (t-tagged format):
2424
// {
25-
// "my_int": { "t": "I32", "v": 42 },
26-
// "my_float": { "t": "F64", "v": 3.1415 },
27-
// "my_bool": { "t": "Boolean", "v": true },
28-
// "my_string": { "t": "String", "v": "hello" },
29-
// "my_array": { "t": "Array", "v": [ ... ] },
30-
// "my_object": { "t": "Object", "v": { ... } },
31-
// "my_null": { "t": "Null", "v": null }
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 }
3232
// }
3333

3434
/// Backend-specific JsonValue -> KvsValue conversion.
@@ -40,98 +40,40 @@ impl From<&JsonValue> for KvsValue {
4040
if let (Some(JsonValue::String(type_str)), Some(value)) =
4141
(obj.get("t"), obj.get("v"))
4242
{
43-
match type_str.as_str() {
44-
"i32" => {
45-
if let JsonValue::Number(num) = value {
46-
return KvsValue::I32(*num as i32);
47-
} else {
48-
return KvsValue::Null; // t mismatch
49-
}
50-
}
51-
"u32" => {
52-
if let JsonValue::Number(num) = value {
53-
return KvsValue::U32(*num as u32);
54-
} else {
55-
return KvsValue::Null;
56-
}
57-
}
58-
"i64" => {
59-
if let JsonValue::Number(num) = value {
60-
return KvsValue::I64(*num as i64);
61-
} else {
62-
return KvsValue::Null;
63-
}
64-
}
65-
"u64" => {
66-
if let JsonValue::Number(num) = value {
67-
return KvsValue::U64(*num as u64);
68-
} else {
69-
return KvsValue::Null;
70-
}
71-
}
72-
"f64" => {
73-
if let JsonValue::Number(num) = value {
74-
return KvsValue::F64(*num);
75-
} else {
76-
return KvsValue::Null;
77-
}
78-
}
79-
"bool" => {
80-
if let JsonValue::Boolean(bv) = value {
81-
return KvsValue::Boolean(*bv);
82-
} else {
83-
return KvsValue::Null;
84-
}
85-
}
86-
"str" => {
87-
if let JsonValue::String(sv) = value {
88-
return KvsValue::String(sv.clone());
89-
} else {
90-
return KvsValue::Null;
91-
}
92-
}
93-
"null" => {
94-
if let JsonValue::Null = value {
95-
return KvsValue::Null;
96-
} else {
97-
return KvsValue::Null;
98-
}
99-
}
100-
"arr" => {
101-
if let JsonValue::Array(vec) = value {
102-
return KvsValue::Array(vec.iter().map(KvsValue::from).collect());
103-
} else {
104-
return KvsValue::Null;
105-
}
106-
}
107-
"obj" => {
108-
if let JsonValue::Object(hm) = value {
109-
return KvsValue::Object(
110-
hm.iter()
111-
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
112-
.collect(),
113-
);
114-
} else {
115-
return KvsValue::Null;
116-
}
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 as f64),
49+
("bool", JsonValue::Boolean(v)) => KvsValue::Boolean(*v),
50+
("str", JsonValue::String(v)) => KvsValue::String(v.clone()),
51+
("null", JsonValue::Null) => KvsValue::Null,
52+
("arr", JsonValue::Array(v)) => {
53+
KvsValue::Array(v.iter().map(KvsValue::from).collect())
11754
}
55+
("obj", JsonValue::Object(v)) => KvsValue::Object(
56+
v.iter()
57+
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
58+
.collect(),
59+
),
11860
_ => {
11961
return KvsValue::Null;
12062
}
121-
}
63+
};
12264
}
123-
// fallback: treat as object of kvs values
124-
KvsValue::Object(
125-
obj.iter()
126-
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
127-
.collect(),
128-
)
65+
// If not a t-tagged object, treat as a map of key-value pairs (KvsMap)
66+
let map: KvsMap = obj
67+
.iter()
68+
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
69+
.collect();
70+
KvsValue::Object(map)
12971
}
130-
JsonValue::Number(n) => KvsValue::F64(*n),
131-
JsonValue::Boolean(b) => KvsValue::Boolean(*b),
132-
JsonValue::String(s) => KvsValue::String(s.clone()),
133-
JsonValue::Null => KvsValue::Null,
134-
JsonValue::Array(arr) => KvsValue::Array(arr.iter().map(KvsValue::from).collect()),
72+
JsonValue::Number(_)
73+
| JsonValue::Boolean(_)
74+
| JsonValue::String(_)
75+
| JsonValue::Null
76+
| JsonValue::Array(_) => KvsValue::Null,
13577
}
13678
}
13779
}

src/rust/rust_kvs/tests/cit_default_values.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,23 @@ fn write_defaults_file(
2020
) -> Result<(), ErrorCode> {
2121
let filepath = dir_string.join(format!("kvs_{}_default.json", instance));
2222

23-
let json = JsonValue::from(data);
23+
// Convert HashMap<String, JsonValue> to t-tagged format
24+
let mut tagged_map = HashMap::new();
25+
for (k, v) in data.into_iter() {
26+
let t = match &v {
27+
JsonValue::Number(_) => "f64", // always treat as f64 for compatibility
28+
JsonValue::Boolean(_) => "bool",
29+
JsonValue::String(_) => "str",
30+
JsonValue::Array(_) => "arr",
31+
JsonValue::Object(_) => "obj",
32+
JsonValue::Null => "null",
33+
};
34+
let mut tagged = HashMap::new();
35+
tagged.insert("v".to_string(), v);
36+
tagged.insert("t".to_string(), JsonValue::String(t.to_string()));
37+
tagged_map.insert(k, JsonValue::Object(tagged));
38+
}
39+
let json = JsonValue::Object(tagged_map);
2440
let mut buf = Vec::new();
2541
let mut gen = JsonGenerator::new(&mut buf).indent(" ");
2642
gen.generate(&json)?;

src/rust/rust_kvs/tests/kvs_default_values.rs

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,42 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
2929
let dir = tempdir()?;
3030
set_current_dir(dir.path())?;
3131

32-
// create defaults file
32+
// create defaults file in t-tagged format
3333
let defaults: HashMap<String, JsonValue> = HashMap::from([
34-
("number1".to_string(), JsonValue::from(123.0)),
35-
("bool1".to_string(), true.into()),
36-
("string1".to_string(), "Hello".to_string().into()),
34+
(
35+
"number1".to_string(),
36+
JsonValue::Object(HashMap::from([
37+
("t".to_string(), JsonValue::String("f64".to_string())),
38+
("v".to_string(), JsonValue::Number(123.0)),
39+
])),
40+
),
41+
(
42+
"bool1".to_string(),
43+
JsonValue::Object(HashMap::from([
44+
("t".to_string(), JsonValue::String("bool".to_string())),
45+
("v".to_string(), JsonValue::Boolean(true)),
46+
])),
47+
),
48+
(
49+
"string1".to_string(),
50+
JsonValue::Object(HashMap::from([
51+
("t".to_string(), JsonValue::String("str".to_string())),
52+
("v".to_string(), JsonValue::String("Hello".to_string())),
53+
])),
54+
),
3755
]);
3856

39-
let json_value = JsonValue::from(defaults);
57+
let json_value = JsonValue::Object(defaults);
4058
let mut buf = Vec::new();
4159
let mut gen = JsonGenerator::new(&mut buf).indent(" ");
4260
gen.generate(&json_value)?;
4361

4462
let data = String::from_utf8(buf)?;
45-
std::fs::write("kvs_0_default.json", &data)?;
63+
let filepath = &dir
64+
.path()
65+
.to_path_buf()
66+
.join(format!("kvs_{}_default.json", 0));
67+
std::fs::write(filepath, &data)?;
4668

4769
// create KVS
4870
let kvs = KvsBuilder::<Kvs>::new(InstanceId::new(0))
@@ -98,11 +120,29 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
98120
// drop the current instance with flush-on-exit enabled and reopen storage
99121
drop(kvs);
100122

101-
// change default of `number1` and `bool1`
123+
// create defaults file in t-tagged format
102124
let defaults: HashMap<String, JsonValue> = HashMap::from([
103-
("number1".to_string(), JsonValue::from(987.0)),
104-
("bool1".to_string(), false.into()),
105-
("string1".to_string(), "Hello".to_string().into()),
125+
(
126+
"number1".to_string(),
127+
JsonValue::Object(HashMap::from([
128+
("t".to_string(), JsonValue::String("f64".to_string())),
129+
("v".to_string(), JsonValue::Number(987.0)),
130+
])),
131+
),
132+
(
133+
"bool1".to_string(),
134+
JsonValue::Object(HashMap::from([
135+
("t".to_string(), JsonValue::String("bool".to_string())),
136+
("v".to_string(), JsonValue::Boolean(false)),
137+
])),
138+
),
139+
(
140+
"string1".to_string(),
141+
JsonValue::Object(HashMap::from([
142+
("t".to_string(), JsonValue::String("str".to_string())),
143+
("v".to_string(), JsonValue::String("Hello".to_string())),
144+
])),
145+
),
106146
]);
107147

108148
let json_value = JsonValue::from(defaults);
@@ -111,7 +151,7 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
111151
gen.generate(&json_value)?;
112152

113153
let data = String::from_utf8(buf)?;
114-
std::fs::write("kvs_0_default.json", &data)?;
154+
std::fs::write(filepath, &data)?;
115155

116156
let kvs = KvsBuilder::<Kvs>::new(InstanceId::new(0))
117157
.need_defaults(false)

0 commit comments

Comments
 (0)