|
| 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 | + |
1 | 12 | use crate::error_code::ErrorCode; |
2 | 13 | use crate::kvs_backend::KvsBackend; |
3 | 14 | use crate::kvs_value::{KvsMap, KvsValue}; |
4 | 15 | use std::fs; |
5 | 16 | use std::path::PathBuf; |
6 | 17 |
|
| 18 | +// for creating jsonvalue obj |
| 19 | +use std::collections::HashMap; |
| 20 | + |
7 | 21 | use tinyjson::{JsonGenerateError, JsonParseError, JsonValue}; |
8 | 22 |
|
| 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 | + |
9 | 34 | /// Backend-specific JsonValue -> KvsValue conversion. |
10 | 35 | impl From<JsonValue> for KvsValue { |
11 | 36 | fn from(val: JsonValue) -> KvsValue { |
12 | 37 | 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, |
23 | 71 | } |
24 | 72 | } |
25 | 73 | } |
26 | 74 |
|
27 | 75 | /// Backend-specific KvsValue -> JsonValue conversion. |
28 | 76 | impl From<KvsValue> for JsonValue { |
29 | 77 | fn from(val: KvsValue) -> JsonValue { |
| 78 | + let mut obj = HashMap::new(); |
30 | 79 | 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 | + } |
35 | 112 | 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 | + ); |
37 | 129 | } |
38 | | - KvsValue::Object(map) => JsonValue::Object( |
39 | | - map.into_iter() |
40 | | - .map(|(k, v)| (k.clone(), JsonValue::from(v))) |
41 | | - .collect(), |
42 | | - ), |
43 | 130 | } |
| 131 | + JsonValue::Object(obj) |
44 | 132 | } |
45 | 133 | } |
46 | 134 |
|
|
0 commit comments