use serde::{Deserialize, Deserializer, Serializer};
use serde::de::Error;
use jiff::civil::Weekday;
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn serialize_weekday<S>(weekday: &Weekday, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer
{
let google_day = weekday_to_google_day(weekday);
serializer.serialize_i32(google_day)
}
pub fn deserialize_weekday<'de, D>(deserializer: D) -> Result<Weekday, D::Error>
where
D: Deserializer<'de>
{
let google_day = i32::deserialize(deserializer)?;
google_day_to_weekday(google_day)
.map_or_else(
|| Err(D::Error::custom(format!(
"Unrecognized weekday {google_day:#?}: expected 0-6 (0=Sunday, 6=Saturday)",
))),
Ok
)
}
const fn google_day_to_weekday(google_day: i32) -> Option<Weekday> {
match google_day {
0 => Some(Weekday::Sunday),
1 => Some(Weekday::Monday),
2 => Some(Weekday::Tuesday),
3 => Some(Weekday::Wednesday),
4 => Some(Weekday::Thursday),
5 => Some(Weekday::Friday),
6 => Some(Weekday::Saturday),
_ => None,
}
}
#[allow(clippy::trivially_copy_pass_by_ref, reason = "for serde")]
const fn weekday_to_google_day(weekday: &Weekday) -> i32 {
match weekday {
Weekday::Sunday => 0,
Weekday::Monday => 1,
Weekday::Tuesday => 2,
Weekday::Wednesday => 3,
Weekday::Thursday => 4,
Weekday::Friday => 5,
Weekday::Saturday => 6,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_weekday_conversion() {
assert_eq!(google_day_to_weekday(0), Some(Weekday::Sunday));
assert_eq!(google_day_to_weekday(1), Some(Weekday::Monday));
assert_eq!(google_day_to_weekday(6), Some(Weekday::Saturday));
assert_eq!(google_day_to_weekday(7), None);
assert_eq!(weekday_to_google_day(&Weekday::Sunday), 0);
assert_eq!(weekday_to_google_day(&Weekday::Monday), 1);
assert_eq!(weekday_to_google_day(&Weekday::Saturday), 6);
}
}