waves_rust/util/json/
json_deserializer.rs

1use crate::error::{Error, Result};
2
3use crate::model::data_entry::DataEntry;
4use crate::model::AssetId;
5
6use serde_json::Value;
7
8pub struct JsonDeserializer;
9
10impl JsonDeserializer {
11    pub fn safe_to_string_from_field(json: &Value, field_name: &str) -> Result<String> {
12        let string = json[field_name]
13            .as_str()
14            .ok_or_else(|| Error::JsonParseError {
15                json: json.to_string(),
16                field: field_name.to_owned(),
17            })?;
18        Ok(string.into())
19    }
20
21    pub fn safe_to_int_from_field(json: &Value, field_name: &str) -> Result<i64> {
22        let int = match json[field_name].as_i64() {
23            Some(int) => int,
24            None => match json[field_name].as_str() {
25                Some(int) => int.parse().map_err(|_| Error::JsonParseError {
26                    json: json.to_string(),
27                    field: field_name.to_owned(),
28                })?,
29                None => Err(Error::JsonParseError {
30                    json: json.to_string(),
31                    field: field_name.to_owned(),
32                })?,
33            },
34        };
35        Ok(int)
36    }
37
38    pub fn safe_to_array_from_field(json: &Value, field_name: &str) -> Result<Vec<Value>> {
39        let array = json[field_name]
40            .as_array()
41            .ok_or_else(|| Error::JsonParseError {
42                json: json.to_string(),
43                field: field_name.to_owned(),
44            })?;
45        Ok(array.to_owned())
46    }
47
48    pub fn safe_to_map_from_field(
49        json: &Value,
50        field_name: &str,
51    ) -> Result<serde_json::Map<String, Value>> {
52        let map = json[field_name]
53            .as_object()
54            .ok_or_else(|| Error::JsonParseError {
55                json: json.to_string(),
56                field: field_name.to_owned(),
57            })?;
58        Ok(map.to_owned())
59    }
60
61    pub fn safe_to_boolean_from_field(json: &Value, field_name: &str) -> Result<bool> {
62        let bool = json[field_name]
63            .as_bool()
64            .ok_or_else(|| Error::JsonParseError {
65                json: json.to_string(),
66                field: field_name.to_owned(),
67            })?;
68        Ok(bool)
69    }
70
71    pub fn safe_to_string(json: &Value) -> Result<String> {
72        let string = json.as_str().ok_or_else(|| Error::JsonParseError {
73            json: json.to_string(),
74            field: "String".to_owned(),
75        })?;
76        Ok(string.to_owned())
77    }
78
79    pub fn safe_to_int(json: &Value) -> Result<i64> {
80        let int = json.as_i64().ok_or_else(|| Error::JsonParseError {
81            json: json.to_string(),
82            field: "i64".to_owned(),
83        })?;
84        Ok(int.to_owned())
85    }
86
87    pub fn safe_to_boolean(json: &Value) -> Result<bool> {
88        let bool = json.as_bool().ok_or_else(|| Error::JsonParseError {
89            json: json.to_string(),
90            field: "bool".to_owned(),
91        })?;
92        Ok(bool)
93    }
94
95    pub fn safe_to_array(json: &Value) -> Result<Vec<Value>> {
96        let array = json.as_array().ok_or_else(|| Error::JsonParseError {
97            json: json.to_string(),
98            field: "Vec<Value>".to_owned(),
99        })?;
100        Ok(array.to_owned())
101    }
102
103    pub fn deserialize_data_array(value: &Value) -> Result<Vec<DataEntry>> {
104        let data_array = Self::safe_to_array(value)?;
105        data_array
106            .iter()
107            .map(|entry| entry.try_into())
108            .collect::<Result<Vec<DataEntry>>>()
109    }
110
111    pub fn asset_id_from_json(json: &Value, field_name: &str) -> Result<Option<AssetId>> {
112        let asset_id = match json[field_name].as_str() {
113            Some(asset_id) => Some(AssetId::from_string(asset_id)?),
114            None => None,
115        };
116        Ok(asset_id)
117    }
118}