Skip to main content

sea_orm/
value.rs

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
79/// Default value for `T`.
80pub trait DefaultActiveValue {
81    /// `Default::default()` if implemented, dummy value otherwise.
82    fn default_value(&self) -> Self;
83}
84
85/// Default value for `Option<T>`.
86pub trait DefaultActiveValueNone {
87    /// Always `None`.
88    fn default_value(&self) -> Self;
89}
90
91/// Default value for non-nullable types.
92pub trait DefaultActiveValueNotSet {
93    /// The owned value type.
94    type Value;
95
96    /// Always `NotSet`.
97    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}