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}