use crate::Error;
use derive_more::Display;
use std::str::FromStr;
#[derive(Debug, Clone, PartialEq, Eq, Display)]
#[non_exhaustive]
pub enum Mode {
#[display("snapshot")]
Snapshot,
#[display("stream")]
Stream,
#[display("{_0}")]
Unknown(String),
}
impl FromStr for Mode {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"snapshot" => Self::Snapshot,
"stream" => Self::Stream,
_ => Self::Unknown(s.to_string()),
})
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn known_roundtrip() {
for (mode, json) in [(Mode::Snapshot, r#""snapshot""#), (Mode::Stream, r#""stream""#)] {
let config = crate::catalog::JsonConfig::new(mode.clone());
let encoded = serde_json::to_value(&config).unwrap();
assert_eq!(encoded["mode"].to_string(), json);
assert_eq!(
serde_json::from_value::<crate::catalog::JsonConfig>(encoded)
.unwrap()
.mode,
mode
);
}
}
#[test]
fn unknown_roundtrip() {
let wire = serde_json::json!({ "mode": "future" });
let config: crate::catalog::JsonConfig = serde_json::from_value(wire.clone()).unwrap();
assert_eq!(config.mode, Mode::Unknown("future".to_string()));
assert_eq!(serde_json::to_value(&config).unwrap(), wire);
}
}