waves_rust/util/json/
json_deserializer.rs1use 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}