use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AttributionClass {
Input,
Resource,
Environment,
Internal,
}
impl AttributionClass {
pub fn as_str(&self) -> &'static str {
match self {
AttributionClass::Input => "input",
AttributionClass::Resource => "resource",
AttributionClass::Environment => "environment",
AttributionClass::Internal => "internal",
}
}
pub fn from_wire(token: &str) -> Option<AttributionClass> {
match token {
"input" => Some(AttributionClass::Input),
"resource" => Some(AttributionClass::Resource),
"environment" => Some(AttributionClass::Environment),
"internal" => Some(AttributionClass::Internal),
_ => None,
}
}
pub fn is_permanent(&self) -> bool {
matches!(self, AttributionClass::Input)
}
}
impl std::fmt::Display for AttributionClass {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test1730_wire_tokens_round_trip() {
for class in [
AttributionClass::Input,
AttributionClass::Resource,
AttributionClass::Environment,
AttributionClass::Internal,
] {
assert_eq!(AttributionClass::from_wire(class.as_str()), Some(class));
}
assert_eq!(AttributionClass::from_wire("user-error"), None);
assert_eq!(AttributionClass::from_wire(""), None);
}
#[test]
fn test1731_only_input_is_permanent() {
assert!(AttributionClass::Input.is_permanent());
assert!(!AttributionClass::Resource.is_permanent());
assert!(!AttributionClass::Environment.is_permanent());
assert!(!AttributionClass::Internal.is_permanent());
}
}