use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum StartDelay {
        MidRoll(i32),
        PreRoll,
        GenericMidRoll,
        GenericPostRoll,
}
impl Serialize for StartDelay {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let v = match self {
            StartDelay::MidRoll(v) => *v,
            StartDelay::PreRoll => 0,
            StartDelay::GenericMidRoll => -1,
            StartDelay::GenericPostRoll => -2,
        };
        serializer.serialize_i32(v)
    }
}
impl<'de> Deserialize<'de> for StartDelay {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let v = match i32::deserialize(deserializer)? {
            v if v > 0 => StartDelay::MidRoll(v),
            0 => StartDelay::PreRoll,
            -1 => StartDelay::GenericMidRoll,
            -2 => StartDelay::GenericPostRoll,
            v => {
                let s = format!(
                    "invalid value: {}, expected 0 or -1 or -2 or greater than 0",
                    v
                );
                return Err(serde::de::Error::custom(s));
            }
        };
        Ok(v)
    }
}
#[cfg(test)]
mod test {
    use super::*;
    #[test]
    fn json() -> serde_json::Result<()> {
        assert!(serde_json::from_str::<StartDelay>("-3").is_err());
        let json = "[10,0,-1,-2]";
        let delays: Vec<StartDelay> = serde_json::from_str(json)?;
        assert_eq!(
            delays,
            vec![
                StartDelay::MidRoll(10),
                StartDelay::PreRoll,
                StartDelay::GenericMidRoll,
                StartDelay::GenericPostRoll
            ]
        );
        assert_eq!(serde_json::to_string(&delays)?, json);
        Ok(())
    }
}