use serde::{Deserialize, Serialize};
use std::str::FromStr;
use crate::error::{ModelError, ModelResult};
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum AdmissionPolicy {
#[default]
DropIfRunning,
Replace,
Queue,
}
impl FromStr for AdmissionPolicy {
type Err = ModelError;
fn from_str(s: &str) -> ModelResult<Self> {
let s = s.trim();
if s.is_empty()
|| s.eq_ignore_ascii_case("drop-if-running")
|| s.eq_ignore_ascii_case("drop")
{
Ok(AdmissionPolicy::DropIfRunning)
} else if s.eq_ignore_ascii_case("queue")
|| s.eq_ignore_ascii_case("add")
|| s.eq_ignore_ascii_case("new")
{
Ok(AdmissionPolicy::Queue)
} else if s.eq_ignore_ascii_case("replace") {
Ok(AdmissionPolicy::Replace)
} else {
Err(ModelError::UnknownAdmission(s.to_string()))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parsing_accepts_canonical_names_aliases_case_and_whitespace() {
let cases = [
("", AdmissionPolicy::default()),
("drop-if-running", AdmissionPolicy::DropIfRunning),
("drop", AdmissionPolicy::DropIfRunning),
("DROP", AdmissionPolicy::DropIfRunning),
("queue", AdmissionPolicy::Queue),
("add", AdmissionPolicy::Queue),
("new", AdmissionPolicy::Queue),
(" queue ", AdmissionPolicy::Queue),
("replace", AdmissionPolicy::Replace),
("REPLACE", AdmissionPolicy::Replace),
];
for (value, expected) in cases {
assert_eq!(value.parse::<AdmissionPolicy>().unwrap(), expected);
}
}
#[test]
fn parsing_rejects_unknown_values() {
assert!("foobar".parse::<AdmissionPolicy>().is_err());
}
}