Skip to content

Commit d08963c

Browse files
committed
impl: Taking ownership of JsonValue in backend
- Taking ownership of JsonValue and KvsValue in backend file.
1 parent 072f9c9 commit d08963c

File tree

1 file changed

+33
-37
lines changed

1 file changed

+33
-37
lines changed

src/rust/rust_kvs/src/json_backend.rs

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,84 +31,80 @@ use tinyjson::{JsonGenerateError, JsonParseError, JsonValue};
3131
// "my_null": { "t": "null", "v": null }
3232
// }
3333

34-
/// Backend-specific JsonValue -> KvsValue conversion.
35-
impl From<&JsonValue> for KvsValue {
36-
fn from(val: &JsonValue) -> KvsValue {
34+
/// Backend-specific JsonValue -> KvsValue conversion (by value).
35+
impl From<JsonValue> for KvsValue {
36+
fn from(val: JsonValue) -> KvsValue {
3737
match val {
38-
JsonValue::Object(obj) => {
38+
JsonValue::Object(mut obj) => {
3939
// Type-tagged: { "t": ..., "v": ... }
4040
if let (Some(JsonValue::String(type_str)), Some(value)) =
41-
(obj.get("t"), obj.get("v"))
41+
(obj.remove("t"), obj.remove("v"))
4242
{
4343
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.clone()),
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),
5151
("null", JsonValue::Null) => KvsValue::Null,
5252
("arr", JsonValue::Array(v)) => {
53-
KvsValue::Array(v.iter().map(KvsValue::from).collect())
53+
KvsValue::Array(v.into_iter().map(KvsValue::from).collect())
5454
}
5555
("obj", JsonValue::Object(v)) => KvsValue::Object(
56-
v.iter()
57-
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
58-
.collect(),
56+
v.into_iter().map(|(k, v)| (k, KvsValue::from(v))).collect(),
5957
),
60-
_ => {
61-
return KvsValue::Null;
62-
}
58+
_ => KvsValue::Null,
6359
};
6460
}
6561
// If not a t-tagged object, treat as a map of key-value pairs (KvsMap)
6662
let map: KvsMap = obj
67-
.iter()
68-
.map(|(k, v)| (k.clone(), KvsValue::from(v)))
63+
.into_iter()
64+
.map(|(k, v)| (k, KvsValue::from(v)))
6965
.collect();
7066
KvsValue::Object(map)
7167
}
68+
JsonValue::Array(arr) => KvsValue::Array(arr.into_iter().map(KvsValue::from).collect()),
7269
JsonValue::Number(_)
7370
| JsonValue::Boolean(_)
7471
| JsonValue::String(_)
75-
| JsonValue::Null
76-
| JsonValue::Array(_) => KvsValue::Null,
72+
| JsonValue::Null => KvsValue::Null,
7773
}
7874
}
7975
}
8076

81-
impl From<&KvsValue> for JsonValue {
82-
fn from(val: &KvsValue) -> JsonValue {
77+
impl From<KvsValue> for JsonValue {
78+
fn from(val: KvsValue) -> JsonValue {
8379
let mut obj = HashMap::new();
8480
match val {
8581
KvsValue::I32(n) => {
8682
obj.insert("t".to_string(), JsonValue::String("i32".to_string()));
87-
obj.insert("v".to_string(), JsonValue::Number(*n as f64));
83+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
8884
}
8985
KvsValue::U32(n) => {
9086
obj.insert("t".to_string(), JsonValue::String("u32".to_string()));
91-
obj.insert("v".to_string(), JsonValue::Number(*n as f64));
87+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
9288
}
9389
KvsValue::I64(n) => {
9490
obj.insert("t".to_string(), JsonValue::String("i64".to_string()));
95-
obj.insert("v".to_string(), JsonValue::Number(*n as f64));
91+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
9692
}
9793
KvsValue::U64(n) => {
9894
obj.insert("t".to_string(), JsonValue::String("u64".to_string()));
99-
obj.insert("v".to_string(), JsonValue::Number(*n as f64));
95+
obj.insert("v".to_string(), JsonValue::Number(n as f64));
10096
}
10197
KvsValue::F64(n) => {
10298
obj.insert("t".to_string(), JsonValue::String("f64".to_string()));
103-
obj.insert("v".to_string(), JsonValue::Number(*n));
99+
obj.insert("v".to_string(), JsonValue::Number(n));
104100
}
105101
KvsValue::Boolean(b) => {
106102
obj.insert("t".to_string(), JsonValue::String("bool".to_string()));
107-
obj.insert("v".to_string(), JsonValue::Boolean(*b));
103+
obj.insert("v".to_string(), JsonValue::Boolean(b));
108104
}
109105
KvsValue::String(s) => {
110106
obj.insert("t".to_string(), JsonValue::String("str".to_string()));
111-
obj.insert("v".to_string(), JsonValue::String(s.clone()));
107+
obj.insert("v".to_string(), JsonValue::String(s));
112108
}
113109
KvsValue::Null => {
114110
obj.insert("t".to_string(), JsonValue::String("null".to_string()));
@@ -118,16 +114,16 @@ impl From<&KvsValue> for JsonValue {
118114
obj.insert("t".to_string(), JsonValue::String("arr".to_string()));
119115
obj.insert(
120116
"v".to_string(),
121-
JsonValue::Array(arr.iter().map(JsonValue::from).collect()),
117+
JsonValue::Array(arr.into_iter().map(JsonValue::from).collect()),
122118
);
123119
}
124120
KvsValue::Object(map) => {
125121
obj.insert("t".to_string(), JsonValue::String("obj".to_string()));
126122
obj.insert(
127123
"v".to_string(),
128124
JsonValue::Object(
129-
map.iter()
130-
.map(|(k, v)| (k.clone(), JsonValue::from(v)))
125+
map.into_iter()
126+
.map(|(k, v)| (k, JsonValue::from(v)))
131127
.collect(),
132128
),
133129
);
@@ -212,7 +208,7 @@ impl KvsBackend for JsonBackend {
212208
}
213209
}
214210

215-
let kvs_value = KvsValue::from(&json_value);
211+
let kvs_value = KvsValue::from(json_value);
216212
if let KvsValue::Object(kvs_map) = kvs_value {
217213
Ok(kvs_map)
218214
} else {
@@ -226,7 +222,7 @@ impl KvsBackend for JsonBackend {
226222
.with_file_name(format!("{}_0.json", destination_path.display()));
227223

228224
let kvs_value = KvsValue::Object(kvs.clone());
229-
let json_value = JsonValue::from(&kvs_value);
225+
let json_value = JsonValue::from(kvs_value);
230226

231227
let json_str = Self::stringify(&json_value).map_err(|_| ErrorCode::JsonParserError)?;
232228
fs::write(&filename, &json_str).map_err(|_| ErrorCode::KvsFileReadError)?;

0 commit comments

Comments
 (0)