#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Qualifier {
#[default]
Pass,
Fail,
SoftFail,
Neutral,
}
impl Qualifier {
pub fn is_pass(&self) -> bool {
matches!(self, Self::Pass)
}
pub fn is_fail(&self) -> bool {
matches!(self, Self::Fail)
}
pub fn is_softfail(&self) -> bool {
matches!(self, Self::SoftFail)
}
pub fn is_neutral(&self) -> bool {
matches!(self, Self::Neutral)
}
pub fn as_str(&self) -> &str {
match self {
Qualifier::Pass => "",
Qualifier::Fail => "-",
Qualifier::SoftFail => "~",
Qualifier::Neutral => "?",
}
}
pub fn as_char(&self) -> char {
match self {
Qualifier::Pass => '+',
Qualifier::Fail => '-',
Qualifier::SoftFail => '~',
Qualifier::Neutral => '?',
}
}
}
impl std::fmt::Display for Qualifier {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Qualifier::Pass => write!(f, ""),
Qualifier::Fail => write!(f, "-"),
Qualifier::SoftFail => write!(f, "~"),
Qualifier::Neutral => write!(f, "?"),
}
}
}
#[test]
fn is_pass() {
let q = Qualifier::Pass;
assert_eq!(q.is_pass(), true);
}
#[test]
fn is_fail() {
let q = Qualifier::Fail;
assert_eq!(q.is_fail(), true);
}
#[test]
fn is_softfail() {
let q = Qualifier::SoftFail;
assert_eq!(q.is_softfail(), true);
}
#[test]
fn is_neutral() {
let q = Qualifier::Neutral;
assert_eq!(q.is_neutral(), true);
}
#[test]
fn as_pass() {
let q = Qualifier::Pass;
assert_eq!(q.as_str(), "");
}
#[test]
fn as_fail() {
let q = Qualifier::Fail;
assert_eq!(q.as_str(), "-");
}
#[test]
fn as_softfail() {
let q = Qualifier::SoftFail;
assert_eq!(q.as_str(), "~");
}
#[test]
fn as_neutral() {
let q = Qualifier::Neutral;
assert_eq!(q.as_str(), "?");
}
#[cfg(test)]
#[cfg(feature = "serde")]
mod serde_test {
use crate::spf::mechanism::Qualifier;
use serde_json;
#[test]
fn pass() {
let q = Qualifier::Pass;
let json = serde_json::to_string(&q).unwrap();
assert_eq!(json, "\"Pass\"");
let deserialized: Qualifier = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, q);
}
#[test]
fn fail() {
let q = Qualifier::Fail;
let json = serde_json::to_string(&q).unwrap();
assert_eq!(json, "\"Fail\"");
let deserialized: Qualifier = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, q);
}
}