@@ -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}
0 commit comments