1use crate::sea_query::{Nullable, ValueType};
2use crate::{ActiveValue, Value};
3
4macro_rules! impl_serde_with_str {
5 ($ty:ty) => {
6 #[cfg(feature = "serde")]
7 impl serde::Serialize for $ty {
8 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9 where
10 S: serde::Serializer,
11 {
12 serializer.serialize_str(&self.to_string())
13 }
14 }
15
16 #[cfg(feature = "serde")]
17 impl<'de> serde::Deserialize<'de> for $ty {
18 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
19 where
20 D: serde::Deserializer<'de>,
21 {
22 let value = <String as serde::Deserialize>::deserialize(deserializer)?;
23 value.parse().map_err(serde::de::Error::custom)
24 }
25 }
26 };
27}
28
29macro_rules! impl_serde_with_i64 {
30 ($ty:ident, $from:ident, $to:ident) => {
31 #[cfg(feature = "serde")]
32 impl serde::Serialize for $ty {
33 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34 where
35 S: serde::Serializer,
36 {
37 serializer.serialize_i64($to(*self))
38 }
39 }
40
41 #[cfg(feature = "serde")]
42 impl<'de> serde::Deserialize<'de> for $ty {
43 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44 where
45 D: serde::Deserializer<'de>,
46 {
47 let value = <i64 as serde::Deserialize>::deserialize(deserializer)?;
48 $from(value).ok_or_else(|| {
49 serde::de::Error::custom(format_args!(
50 "failed to convert i64 to {}",
51 stringify!($ty)
52 ))
53 })
54 }
55 }
56 };
57}
58
59pub(super) use {impl_serde_with_i64, impl_serde_with_str};
60
61mod timestamp;
62use timestamp::*;
63
64#[cfg(feature = "with-chrono")]
65mod with_chrono;
66#[cfg(feature = "with-chrono")]
67pub use with_chrono::*;
68
69#[cfg(feature = "with-time")]
70mod with_time;
71#[cfg(feature = "with-time")]
72pub use with_time::*;
73
74#[cfg(feature = "with-uuid")]
75mod text_uuid;
76#[cfg(feature = "with-uuid")]
77pub use text_uuid::*;
78
79pub trait DefaultActiveValue {
81 fn default_value(&self) -> Self;
83}
84
85pub trait DefaultActiveValueNone {
87 fn default_value(&self) -> Self;
89}
90
91pub trait DefaultActiveValueNotSet {
93 type Value;
95
96 fn default_value(&self) -> Self::Value;
98}
99
100impl<V> DefaultActiveValue for ActiveValue<V>
101where
102 V: Into<Value> + ValueType + Nullable,
103{
104 fn default_value(&self) -> Self {
105 match V::try_from(V::null().dummy_value()) {
106 Ok(v) => ActiveValue::Set(v),
107 Err(_) => ActiveValue::NotSet,
108 }
109 }
110}
111
112impl<V> DefaultActiveValueNone for ActiveValue<Option<V>>
113where
114 V: Into<Value> + Nullable,
115{
116 fn default_value(&self) -> Self {
117 ActiveValue::Set(None)
118 }
119}
120
121impl<V> DefaultActiveValueNotSet for &ActiveValue<V>
122where
123 V: Into<Value>,
124{
125 type Value = ActiveValue<V>;
126
127 fn default_value(&self) -> Self::Value {
128 ActiveValue::NotSet
129 }
130}
131
132#[cfg(test)]
133mod test {
134 use super::*;
135 use crate::prelude::TimeDateTime;
136
137 #[test]
138 fn test_default_value() {
139 let v = (&ActiveValue::<i32>::NotSet).default_value();
140 assert_eq!(v, ActiveValue::Set(0));
141
142 let v = (&ActiveValue::<Option<i32>>::NotSet).default_value();
143 assert_eq!(v, ActiveValue::Set(None));
144
145 let v = (&ActiveValue::<String>::NotSet).default_value();
146 assert_eq!(v, ActiveValue::Set("".to_owned()));
147
148 let v = (&ActiveValue::<Option<String>>::NotSet).default_value();
149 assert_eq!(v, ActiveValue::Set(None));
150
151 let v = (&ActiveValue::<TimeDateTime>::NotSet).default_value();
152 assert!(matches!(v, ActiveValue::Set(_)));
153 }
154}