value_ext/json/
as_type.rs

1use 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}