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(())
}
}