use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Provenance {
Derived,
Authored,
Inferred,
}
impl Provenance {
#[must_use]
pub fn from_token(s: &str) -> Option<Self> {
match s {
"derived" => Some(Self::Derived),
"authored" => Some(Self::Authored),
"inferred" => Some(Self::Inferred),
_ => None,
}
}
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Derived => "derived",
Self::Authored => "authored",
Self::Inferred => "inferred",
}
}
}
#[cfg(test)]
mod tests {
use super::Provenance;
#[test]
fn stable_string_forms() {
assert_eq!(Provenance::Derived.as_str(), "derived");
assert_eq!(Provenance::Authored.as_str(), "authored");
assert_eq!(Provenance::Inferred.as_str(), "inferred");
}
#[test]
fn from_token_round_trips_and_rejects_unknown() {
for p in [
Provenance::Derived,
Provenance::Authored,
Provenance::Inferred,
] {
assert_eq!(Provenance::from_token(p.as_str()), Some(p));
}
assert_eq!(Provenance::from_token("bogus"), None);
}
}