use super::Signature;
use crate::{DnsError, Error};
use std::fmt::Display;
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum DkimResult {
Pass,
Neutral(crate::Error),
Fail(crate::Error),
PermError(crate::Error),
TempError(crate::Error),
None,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct DkimOutput<'x> {
pub(crate) result: DkimResult,
pub(crate) signature: Option<&'x Signature>,
pub(crate) report: Option<String>,
pub(crate) is_atps: bool,
}
impl<'x> DkimOutput<'x> {
pub(crate) fn pass() -> Self {
DkimOutput {
result: DkimResult::Pass,
signature: None,
report: None,
is_atps: false,
}
}
pub(crate) fn perm_err(err: Error) -> Self {
DkimOutput {
result: DkimResult::PermError(err),
signature: None,
report: None,
is_atps: false,
}
}
pub(crate) fn temp_err(err: Error) -> Self {
DkimOutput {
result: DkimResult::TempError(err),
signature: None,
report: None,
is_atps: false,
}
}
pub(crate) fn fail(err: Error) -> Self {
DkimOutput {
result: DkimResult::Fail(err),
signature: None,
report: None,
is_atps: false,
}
}
pub(crate) fn neutral(err: Error) -> Self {
DkimOutput {
result: DkimResult::Neutral(err),
signature: None,
report: None,
is_atps: false,
}
}
pub(crate) fn dns_error(err: Error) -> Self {
if matches!(&err, Error::Dns(DnsError::Resolver(_))) {
DkimOutput::temp_err(err)
} else {
DkimOutput::perm_err(err)
}
}
pub fn with_signature(mut self, signature: &'x Signature) -> Self {
self.signature = signature.into();
self
}
pub(crate) fn with_atps(mut self) -> Self {
self.is_atps = true;
self
}
pub fn result(&self) -> &DkimResult {
&self.result
}
pub fn signature(&self) -> Option<&Signature> {
self.signature
}
pub fn report_address(&self) -> Option<&str> {
self.report.as_deref()
}
pub fn is_atps(&self) -> bool {
self.is_atps
}
}
impl From<DkimResult> for DkimOutput<'_> {
fn from(result: DkimResult) -> Self {
DkimOutput {
result,
signature: None,
report: None,
is_atps: false,
}
}
}
impl From<Error> for DkimResult {
fn from(err: Error) -> Self {
if matches!(&err, Error::Dns(DnsError::Resolver(_))) {
DkimResult::TempError(err)
} else {
DkimResult::PermError(err)
}
}
}
impl Display for DkimResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DkimResult::Pass => f.write_str("pass"),
DkimResult::Fail(err) => write!(f, "fail; {err}"),
DkimResult::Neutral(err) => write!(f, "neutral; {err}"),
DkimResult::TempError(err) => write!(f, "temp error; {err}"),
DkimResult::PermError(err) => write!(f, "perm error; {err}"),
DkimResult::None => f.write_str("none"),
}
}
}