1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
pub mod transactions;
use crate::*;
pub type DefaultHasher = std::hash::BuildHasherDefault<std::collections::hash_map::DefaultHasher>;
#[derive(Copy, Clone, Debug, Error)]
#[error("Fail to convert serde_json::Value into json_pest_parser::JSONValue")]
pub struct JsonValueConversionError;
pub fn serde_json_value_to_pest_json_value(
value: &Value,
) -> Result<JSONValue<DefaultHasher>, JsonValueConversionError> {
match value {
Value::Null => Ok(JSONValue::Null),
Value::Bool(boolean) => Ok(JSONValue::Boolean(*boolean)),
Value::Number(number) => Ok(JSONValue::Number(if let Some(u64_) = number.as_u64() {
Number::U64(u64_)
} else if let Some(f64_) = number.as_f64() {
Number::F64(f64_)
} else {
return Err(JsonValueConversionError);
})),
Value::String(string) => Ok(JSONValue::String(string)),
Value::Array(values) => Ok(JSONValue::Array(
values
.iter()
.map(serde_json_value_to_pest_json_value)
.collect::<Result<Vec<JSONValue<DefaultHasher>>, JsonValueConversionError>>()?,
)),
Value::Object(map) => Ok(JSONValue::Object(
map.into_iter()
.map(|(k, v)| match serde_json_value_to_pest_json_value(v) {
Ok(v) => Ok((k.as_str(), v)),
Err(e) => Err(e),
})
.collect::<Result<
HashMap<&str, JSONValue<DefaultHasher>, DefaultHasher>,
JsonValueConversionError,
>>()?,
)),
}
}