Skip to main content

ebi_objects/
json.rs

1use ebi_arithmetic::Fraction;
2use ebi_arithmetic::anyhow::{Result, anyhow};
3use serde_json::{Map, Value};
4
5pub fn read_field_number(json: &Value, field: &str) -> Result<usize> {
6    match &json[field] {
7        Value::Null => return Err(anyhow!("field not found")),
8        Value::Bool(_) => return Err(anyhow!("field is a boolean, where number expected")),
9        Value::Number(n) => {
10            if !n.is_u64() {
11                return Err(anyhow!("number is not an integer"));
12            }
13            return Ok(usize::try_from(n.as_u64().unwrap())?);
14        }
15        Value::String(_) => return Err(anyhow!("field is a literal, where number expected")),
16        Value::Array(_) => return Err(anyhow!("field is a list, where number expected")),
17        Value::Object(_) => return Err(anyhow!("field is an object, where number expected")),
18    }
19}
20
21pub fn read_field_fraction(json: &Value, field: &str) -> Result<Fraction> {
22    match &json[field] {
23        Value::Null => return Err(anyhow!("field not found")),
24        Value::Bool(_) => return Err(anyhow!("field is a boolean, where fraction expected")),
25        Value::Number(n) => return Ok(n.to_string().parse::<Fraction>()?),
26        Value::String(s) => return Ok(s.parse::<Fraction>()?),
27        Value::Array(_) => return Err(anyhow!("field is a list, where fraction expected")),
28        Value::Object(_) => return Err(anyhow!("field is an object, where fraction expected")),
29    }
30}
31
32pub fn read_field_list<'a>(json: &'a Value, field: &str) -> Result<&'a Vec<Value>> {
33    match &json[field] {
34        Value::Null => return Err(anyhow!("field not found")),
35        Value::Bool(_) => return Err(anyhow!("field is a boolean, where list expected")),
36        Value::Number(_) => return Err(anyhow!("field is a number, where list expected")),
37        Value::String(_) => return Err(anyhow!("field is a literal, where list expected")),
38        Value::Array(arr) => return Ok(&arr),
39        Value::Object(_) => return Err(anyhow!("field is an object, where list expected")),
40    }
41}
42
43pub fn read_field_object<'a>(json: &'a Value, field: &str) -> Result<&'a Map<String, Value>> {
44    match &json[field] {
45        Value::Null => return Err(anyhow!("field not found")),
46        Value::Bool(_) => return Err(anyhow!("field is a boolean, where object expected")),
47        Value::Number(_) => return Err(anyhow!("field is a number, where object expected")),
48        Value::String(_) => return Err(anyhow!("field is a literal, where object expected")),
49        Value::Array(_) => return Err(anyhow!("field is an array, where object expected")),
50        Value::Object(obj) => Ok(&obj),
51    }
52}
53
54pub fn read_field_string<'a>(json: &'a Value, field: &str) -> Result<String> {
55    match &json[field] {
56        Value::Null => return Err(anyhow!("field not found")),
57        Value::Bool(_) => return Err(anyhow!("field is a boolean, where literal expected")),
58        Value::Number(n) => return Ok(n.to_string()),
59        Value::String(s) => return Ok(s.to_string()),
60        Value::Array(_) => return Err(anyhow!("field is a list, where literal expected")),
61        Value::Object(_) => return Err(anyhow!("field is an object, where literal expected")),
62    }
63}
64
65pub fn read_number(json: &Value) -> Result<usize> {
66    match &json {
67        Value::Null => return Err(anyhow!("field not found")),
68        Value::Bool(_) => return Err(anyhow!("field is a boolean, where number expected")),
69        Value::Number(n) => {
70            if !n.is_u64() {
71                return Err(anyhow!("number is not an integer"));
72            }
73            return Ok(usize::try_from(n.as_u64().unwrap())?);
74        }
75        Value::String(_) => return Err(anyhow!("field is a literal, where number expected")),
76        Value::Array(_) => return Err(anyhow!("field is a list, where number expected")),
77        Value::Object(_) => return Err(anyhow!("field is an object, where number expected")),
78    }
79}
80
81pub fn read_string(json: &Value) -> Result<&String> {
82    match &json {
83        Value::Null => return Err(anyhow!("field not found")),
84        Value::Bool(_) => return Err(anyhow!("field is a boolean, where literal expected")),
85        Value::Number(_) => return Err(anyhow!("field is a number, where literal expected")),
86        Value::String(s) => return Ok(s),
87        Value::Array(_) => return Err(anyhow!("field is a list, where literal expected")),
88        Value::Object(_) => return Err(anyhow!("field is an object, where literal expected")),
89    }
90}
91
92pub fn read_list(json: &Value) -> Result<&Vec<Value>> {
93    match &json {
94        Value::Null => return Err(anyhow!("field not found")),
95        Value::Bool(_) => return Err(anyhow!("field is a boolean, where list expected")),
96        Value::Number(_) => return Err(anyhow!("field is a number, where list expected")),
97        Value::String(_) => return Err(anyhow!("field is a literal, where list expected")),
98        Value::Array(s) => return Ok(s),
99        Value::Object(_) => return Err(anyhow!("field is an object, where literal expected")),
100    }
101}
102
103pub fn read_fraction(json: &Value) -> Result<Fraction> {
104    match &json {
105        Value::Null => return Err(anyhow!("field not found")),
106        Value::Bool(_) => return Err(anyhow!("field is a boolean, where fraction expected")),
107        Value::Number(n) => return Ok(n.to_string().parse::<Fraction>()?),
108        Value::String(s) => return Ok(s.parse::<Fraction>()?),
109        Value::Array(_) => return Err(anyhow!("field is a list, where fraction expected")),
110        Value::Object(_) => return Err(anyhow!("field is an object, where fraction expected")),
111    }
112}