mantra-lancer 0.1.0

Currency tracker for Massif Press' LANCER system
Documentation
pub(crate) mod utc_offset {
    use serde::{Deserialize, Deserializer, Serialize, Serializer};
    use time::UtcOffset;

    #[derive(Serialize, Deserialize)]
    struct UtcOffsetDef {
        hours: Option<i8>,
        minutes: Option<i8>,
        seconds: Option<i8>,
    }

    pub fn deserialize<'de, D>(deserializer: D) -> Result<UtcOffset, D::Error>
    where
        D: Deserializer<'de>,
    {
        Ok(match <Option<UtcOffsetDef>>::deserialize(deserializer)? {
            Some(UtcOffsetDef {
                hours,
                minutes,
                seconds,
            }) => UtcOffset::from_hms(
                hours.unwrap_or(0),
                minutes.unwrap_or(0),
                seconds.unwrap_or(0),
            )
            .ok(),
            None => UtcOffset::current_local_offset().ok(),
        }
        .unwrap_or(UtcOffset::UTC))
    }

    pub fn serialize<S>(utc_offset: &UtcOffset, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let (hours, minutes, seconds) = utc_offset.as_hms();
        UtcOffsetDef {
            hours: Some(hours),
            minutes: Some(minutes),
            seconds: Some(seconds),
        }
        .serialize(serializer)
    }
}