#![allow(clippy::ref_option, clippy::trivially_copy_pass_by_ref, reason = "for serde")]
use serde::{Deserialize, Deserializer, Serializer};
use serde::de::Error;
pub fn serialize_optional_year<S>(year: &Option<i16>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match year {
Some(year) => serializer.serialize_i16(*year),
None => serializer.serialize_i16(0),
}
}
pub fn deserialize_optional_year<'de, D>(deserializer: D) -> Result<Option<i16>, D::Error>
where
D: Deserializer<'de>,
{
let year_i16 = i16::deserialize(deserializer)?;
match year_i16 {
0 => Ok(None),
1..=9_999 => Ok(Some(year_i16)),
_ => Err(D::Error::custom(format!(
"invalid year value {year_i16:?}: must be 0 (unspecified) or 1-9999"
))),
}
}