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)
    }

    // v可以是boolean or number or string类型
    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)
    }
}