mybatis_drive/types/
json.rs1use 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#[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 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}