mybatis_drive/types/
json.rs

1use std::any::type_name;
2use std::borrow::BorrowMut;
3use std::ops::{Deref, DerefMut};
4use std::slice::IterMut;
5use rbson::{Binary, Bson, Document};
6use rbson::spec::BinarySubtype;
7use serde::{Deserializer, Serialize, Serializer};
8use serde::de::{DeserializeOwned, Error, Expected};
9use serde_json::ser::Formatter;
10use serde_json::Value;
11use crate::types::{BINARY_SUBTYPE_JSON};
12
13/// Json
14#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
15pub struct Json<T> where T: Serialize {
16    pub inner: T,
17}
18
19impl<T> From<T> for Json<T> where T: Serialize {
20    fn from(arg: T) -> Self {
21        Self {
22            inner: arg
23        }
24    }
25}
26
27impl<T> From<&T> for Json<T> where T: Serialize + Clone {
28    fn from(arg: &T) -> Self {
29        Self {
30            inner: arg.clone()
31        }
32    }
33}
34
35
36impl<T: Serialize> serde::Serialize for Json<T> {
37    #[inline]
38    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
39        use serde::ser::Error;
40        if type_name::<S::Error>().eq("rbson::ser::error::Error") {
41            return Binary {
42                subtype: BinarySubtype::UserDefined(BINARY_SUBTYPE_JSON),
43                bytes: serde_json::to_vec(&self.inner).unwrap_or_default(),
44            }.serialize(serializer);
45        }else{
46            return self.inner.serialize(serializer);
47        }
48    }
49}
50
51impl<'de, T> serde::Deserialize<'de> for Json<T> where T: Serialize + DeserializeOwned {
52    #[inline]
53    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
54        let b = Bson::deserialize(deserializer)?;
55        match b {
56            Bson::String(s) => {
57                return Ok(Self {
58                    inner: serde_json::from_str(&s).or_else(|e| Err(D::Error::custom(e.to_string())))?,
59                });
60            }
61            Bson::Binary(data) => {
62                let v = serde_json::from_slice::<T>(&data.bytes).or_else(|e| Err(D::Error::custom(e.to_string())))?;
63                Ok(Json {
64                    inner: v,
65                })
66            }
67            Bson::Decimal128(v) => {
68                let v = serde_json::from_value::<T>(serde_json::Value::String(v.to_string())).or_else(|e| Err(D::Error::custom(e.to_string())))?;
69                Ok(Json {
70                    inner: v,
71                })
72            }
73            _ => {
74                let v = serde_json::from_value::<T>(b.into_canonical_extjson()).or_else(|e| Err(D::Error::custom(e.to_string())))?;
75                Ok(Json {
76                    inner: v,
77                })
78            }
79        }
80    }
81}
82
83impl<T: Serialize> std::fmt::Display for Json<T> where T: std::fmt::Display {
84    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
85        self.inner.fmt(f)
86    }
87}
88
89impl<T: Serialize> std::fmt::Debug for Json<T> where T: std::fmt::Debug {
90    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
91        self.inner.fmt(f)
92    }
93}
94
95impl<T: Serialize> Json<T> {
96    pub fn to_string(&self) -> String where T: std::fmt::Display {
97        self.inner.to_string()
98    }
99}
100
101impl<T: Serialize> Deref for Json<T> {
102    type Target = T;
103
104    fn deref(&self) -> &Self::Target {
105        &self.inner
106    }
107}
108
109impl<T: Serialize> DerefMut for Json<T> {
110    fn deref_mut(&mut self) -> &mut Self::Target {
111        &mut self.inner
112    }
113}
114
115impl<T> Json<T> where T: Serialize {
116    pub fn from_value(arg: Value) -> Self where T: Serialize + DeserializeOwned + Default {
117        Json {
118            inner: serde_json::from_value(arg).unwrap_or_default()
119        }
120    }
121}
122
123impl<T> Json<T> where T: Serialize + DeserializeOwned {
124    /// create from str
125    pub fn from_str(arg: &str) -> Result<Self, crate::error::Error> {
126        let inner = serde_json::from_str(arg)?;
127        Ok(Self {
128            inner: inner
129        })
130    }
131}
132
133
134#[cfg(test)]
135mod test {
136    use crate::types::Json;
137
138    #[test]
139    fn test_ser_de() {
140        let b = Json {
141            inner: 1
142        };
143        let bsons = rbson::to_bson(&b).unwrap();
144        let b_de: Json<i32> = rbson::from_bson(bsons).unwrap();
145        assert_eq!(b, b_de);
146    }
147}