value_ext/json/
as_type.rs1use crate::JsonValueExtError;
2use serde_json::Value;
3
4pub trait AsType<'a>: Sized {
5 fn from_value(value: &'a Value) -> Result<Self, JsonValueExtError>;
6}
7
8impl<'a> AsType<'a> for &'a str {
9 fn from_value(value: &'a Value) -> Result<Self, JsonValueExtError> {
10 value.as_str().ok_or(JsonValueExtError::ValueNotOfType("str"))
11 }
12}
13
14impl<'a> AsType<'a> for Option<&'a str> {
15 fn from_value(value: &'a Value) -> Result<Self, JsonValueExtError> {
16 Ok(value.as_str())
17 }
18}
19
20impl AsType<'_> for f64 {
21 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
22 value.as_f64().ok_or(JsonValueExtError::ValueNotOfType("f64"))
23 }
24}
25
26impl AsType<'_> for Option<f64> {
27 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
28 Ok(value.as_f64())
29 }
30}
31
32impl AsType<'_> for i64 {
33 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
34 value.as_i64().ok_or(JsonValueExtError::ValueNotOfType("i64"))
35 }
36}
37
38impl AsType<'_> for Option<i64> {
39 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
40 Ok(value.as_i64())
41 }
42}
43
44impl AsType<'_> for i32 {
45 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
46 value
47 .as_i64()
48 .and_then(|v| i32::try_from(v).ok())
49 .ok_or(JsonValueExtError::ValueNotOfType("i32"))
50 }
51}
52
53impl AsType<'_> for Option<i32> {
54 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
55 Ok(value.as_i64().and_then(|v| i32::try_from(v).ok()))
56 }
57}
58
59impl AsType<'_> for u32 {
60 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
61 value
62 .as_u64()
63 .and_then(|v| u32::try_from(v).ok())
64 .ok_or(JsonValueExtError::ValueNotOfType("u32"))
65 }
66}
67
68impl AsType<'_> for Option<u32> {
69 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
70 Ok(value.as_u64().and_then(|v| u32::try_from(v).ok()))
71 }
72}
73
74impl AsType<'_> for bool {
75 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
76 value.as_bool().ok_or(JsonValueExtError::ValueNotOfType("bool"))
77 }
78}
79
80impl AsType<'_> for Option<bool> {
81 fn from_value(value: &Value) -> Result<Self, JsonValueExtError> {
82 Ok(value.as_bool())
83 }
84}