Skip to main content

io_smtp/rfc3463/
enhanced_status_code.rs

1//! Enhanced status code (RFC 3463).
2
3use core::fmt;
4
5use bounded_static_derive::ToStatic;
6
7/// Enhanced status code (RFC 3463).
8///
9/// Format: class.subject.detail (e.g., 2.1.0, 5.7.1)
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, ToStatic)]
11pub struct SmtpEnhancedStatusCode {
12    /// Class: 2 (success), 4 (temporary failure), or 5 (permanent failure)
13    pub class: u8,
14    /// Subject: 0-999
15    pub subject: u16,
16    /// Detail: 0-999
17    pub detail: u16,
18}
19
20impl SmtpEnhancedStatusCode {
21    /// Creates a new enhanced status code.
22    ///
23    /// Returns `None` if class is not 2, 4, or 5.
24    pub fn new(class: u8, subject: u16, detail: u16) -> Option<Self> {
25        if matches!(class, 2 | 4 | 5) && subject < 1000 && detail < 1000 {
26            Some(Self {
27                class,
28                subject,
29                detail,
30            })
31        } else {
32            None
33        }
34    }
35
36    /// Returns true if this indicates success.
37    pub fn is_success(&self) -> bool {
38        self.class == 2
39    }
40
41    /// Returns true if this indicates a temporary failure.
42    pub fn is_temporary_failure(&self) -> bool {
43        self.class == 4
44    }
45
46    /// Returns true if this indicates a permanent failure.
47    pub fn is_permanent_failure(&self) -> bool {
48        self.class == 5
49    }
50}
51
52impl fmt::Display for SmtpEnhancedStatusCode {
53    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
54        write!(f, "{}.{}.{}", self.class, self.subject, self.detail)
55    }
56}