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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use cyfs_base::{BuckyError, BuckyErrorCode, BuckyResult};
use std::str::FromStr;
pub struct HJsonHelper;
impl HJsonHelper {
pub fn decode_from_string<T>(v: &serde_hjson::Value) -> BuckyResult<T>
where
T: FromStr,
<T as FromStr>::Err: std::fmt::Display,
{
if !v.is_string() {
let msg = format!("invalid json field, except string: {}", v);
warn!("{}", msg);
return Err(BuckyError::new(BuckyErrorCode::InvalidFormat, msg));
}
let v = T::from_str(v.as_str().unwrap()).map_err(|e| {
let msg = format!(
"parse json string error: value={}, {}",
v.as_str().unwrap(),
e
);
warn!("{}", msg);
BuckyError::new(BuckyErrorCode::InvalidFormat, msg)
})?;
Ok(v)
}
pub fn decode_from_boolean(v: &serde_hjson::Value) -> BuckyResult<bool> {
let v = v.as_bool().ok_or_else(|| {
let msg = format!("invalid json field, except bool: {}", v);
warn!("{}", msg);
BuckyError::new(BuckyErrorCode::InvalidFormat, msg)
})?;
Ok(v)
}
pub fn decode_boolean(v: &serde_hjson::Value) -> BuckyResult<bool> {
let ret: bool;
if v.is_boolean() {
ret = v.as_bool().unwrap();
} else if v.is_number() {
let v = v.as_u64().ok_or_else(|| {
let msg = format!("invalid json field, except u64: {}", v);
warn!("{}", msg);
BuckyError::new(BuckyErrorCode::InvalidFormat, msg)
})?;
if v == 0 {
ret = false;
} else if v == 1 {
ret = true;
} else {
let msg = format!("invalid json number field, except 0 or 1: {}", v);
warn!("{}", msg);
return Err(BuckyError::new(BuckyErrorCode::InvalidFormat, msg));
}
} else if v.is_string() {
let v = v.as_str().unwrap();
if v == "0" {
ret = false;
} else if v == "1" {
ret = true;
} else {
let msg = format!("invalid json string field, except '0' or '1': {}", v);
warn!("{}", msg);
return Err(BuckyError::new(BuckyErrorCode::InvalidFormat, msg));
}
} else {
let msg = format!("invalid json field, except boolean/number/string: {}", v);
warn!("{}", msg);
return Err(BuckyError::new(BuckyErrorCode::InvalidFormat, msg));
}
Ok(ret)
}
pub fn decode_u64(v: &serde_hjson::Value) -> BuckyResult<u64> {
let v = v.as_u64().ok_or_else(|| {
let msg = format!("invalid json field, except u64: {}", v);
warn!("{}", msg);
BuckyError::new(BuckyErrorCode::InvalidFormat, msg)
})?;
Ok(v)
}
}