use std::fmt::{self, Display};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum PriorityLevel {
#[default]
High,
Low,
}
impl PriorityLevel {
pub fn as_str(&self) -> &'static str {
match self {
Self::High => "High",
Self::Low => "Low",
}
}
}
impl Display for PriorityLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl std::str::FromStr for PriorityLevel {
type Err = azure_core::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"High" => Ok(Self::High),
"Low" => Ok(Self::Low),
_ => Err(azure_core::Error::with_message(
azure_core::error::ErrorKind::DataConversion,
format!("Unknown priority level: {s}"),
)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use azure_core::error::ErrorKind;
#[test]
fn parses_valid_priority_levels() {
let high: PriorityLevel = "High".parse().expect("parse High");
let low: PriorityLevel = "Low".parse().expect("parse Low");
assert_eq!(high, PriorityLevel::High);
assert_eq!(low, PriorityLevel::Low);
}
#[test]
fn parsing_invalid_priority_returns_data_conversion_error() {
let err = "Medium"
.parse::<PriorityLevel>()
.expect_err("expected error for invalid priority");
assert_eq!(*err.kind(), ErrorKind::DataConversion);
assert!(
err.to_string().contains("Unknown priority level: Medium"),
"unexpected error message: {err}"
);
}
#[test]
fn display_roundtrips_through_from_str() {
for level in [PriorityLevel::High, PriorityLevel::Low] {
let s = level.to_string();
assert_eq!(s, level.as_str());
let parsed: PriorityLevel = s.parse().expect("roundtrip parse failed");
assert_eq!(parsed, level);
}
}
}