#[derive(Serialize, Deserialize, Debug, Default, Clone, Hash, PartialEq, Eq)]
#[serde(untagged)]
pub enum ProvidedValue<T> {
Set(T),
#[serde(skip)]
#[default]
Unset,
}
impl<T> ProvidedValue<T> {
#[inline]
pub fn to_option(&self) -> Option<&T> {
match self {
ProvidedValue::Set(ref value) => Some(value),
ProvidedValue::Unset => None,
}
}
}
impl<T> ProvidedValue<T>
where
T: Into<sea_orm::Value>,
{
#[inline]
pub fn into_active_value(self) -> sea_orm::ActiveValue<T> {
match self {
ProvidedValue::Set(value) => sea_orm::ActiveValue::Set(value),
ProvidedValue::Unset => sea_orm::ActiveValue::NotSet,
}
}
}
impl<T> From<ProvidedValue<T>> for Option<T> {
#[inline]
fn from(value: ProvidedValue<T>) -> Option<T> {
match value {
ProvidedValue::Set(value) => Some(value),
ProvidedValue::Unset => None,
}
}
}
#[test]
fn provided_value_deserialize() {
use serde_json::json;
#[derive(Deserialize, Debug)]
struct Object {
#[serde(default)]
field: ProvidedValue<Option<String>>,
}
macro_rules! check {
($value:expr, $expected:expr $(,)?) => {{
let object: Object =
serde_json::from_value($value).expect("Unable to deserialize JSON");
assert_eq!(
object.field, $expected,
"Actual optional item doesn't match expected",
);
}};
}
check!(json!({}), ProvidedValue::Unset);
check!(json!({ "field": null }), ProvidedValue::Set(None));
check!(
json!({"field": "value"}),
ProvidedValue::Set(Some(str!("value"))),
);
}