use strum::{AsRefStr, Display, EnumIter, EnumString};
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, AsRefStr, Display, EnumString, EnumIter)]
#[strum(ascii_case_insensitive, serialize_all = "UPPERCASE")]
pub enum Method {
Options,
#[default]
Get,
Post,
Put,
Delete,
Head,
Trace,
Connect,
Patch,
}
impl Method {
pub fn is_safe(&self) -> bool {
use Method::*;
matches!(self, Get | Head | Options | Trace)
}
pub fn is_idempotent(&self) -> bool {
use Method::*;
match self {
Put | Delete => true,
_ => self.is_safe(),
}
}
}
#[cfg(test)]
mod tests {
use core::str::FromStr;
use strum::IntoEnumIterator;
use super::*;
#[test]
fn test_enum_string() {
for method in Method::iter() {
let str = method.as_ref();
assert_eq!(Method::from_str(str).unwrap(), method);
}
}
#[test]
fn test_is_idempotent() {
assert!(Method::Options.is_idempotent());
assert!(Method::Get.is_idempotent());
assert!(Method::Put.is_idempotent());
assert!(Method::Delete.is_idempotent());
assert!(Method::Head.is_idempotent());
assert!(Method::Trace.is_idempotent());
assert!(!Method::Post.is_idempotent());
assert!(!Method::Connect.is_idempotent());
assert!(!Method::Patch.is_idempotent());
}
}