ripht_php_sapi/execution/
message.rs

1/// PHP error severity levels (maps to syslog priorities).
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum SyslogLevel {
4    Emergency = 0,
5    Alert = 1,
6    Critical = 2,
7    Error = 3,
8    Warning = 4,
9    Notice = 5,
10    Info = 6,
11    Debug = 7,
12}
13
14impl SyslogLevel {
15    pub fn from_raw(level: i32) -> Self {
16        match level {
17            0 => Self::Emergency,
18            1 => Self::Alert,
19            2 => Self::Critical,
20            3 => Self::Error,
21            4 => Self::Warning,
22            5 => Self::Notice,
23            6 => Self::Info,
24            7 => Self::Debug,
25            _ if level < 0 => Self::Emergency,
26            _ => Self::Debug,
27        }
28    }
29
30    pub fn is_error_or_worse(&self) -> bool {
31        matches!(
32            self,
33            Self::Emergency | Self::Alert | Self::Critical | Self::Error
34        )
35    }
36
37    pub fn is_warning_or_worse(&self) -> bool {
38        self.is_error_or_worse() || matches!(self, Self::Warning)
39    }
40
41    pub fn as_str(&self) -> &'static str {
42        match self {
43            Self::Emergency => "emerg",
44            Self::Alert => "alert",
45            Self::Critical => "crit",
46            Self::Error => "err",
47            Self::Warning => "warning",
48            Self::Notice => "notice",
49            Self::Info => "info",
50            Self::Debug => "debug",
51        }
52    }
53}
54
55impl std::fmt::Display for SyslogLevel {
56    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57        write!(f, "{}", self.as_str())
58    }
59}
60
61impl From<i32> for SyslogLevel {
62    fn from(level: i32) -> Self {
63        Self::from_raw(level)
64    }
65}
66
67impl From<SyslogLevel> for i32 {
68    fn from(level: SyslogLevel) -> Self {
69        level as i32
70    }
71}
72
73/// A PHP error, warning, or notice captured during execution.
74#[derive(Debug, Clone)]
75#[non_exhaustive]
76pub struct ExecutionMessage {
77    pub message: String,
78    pub level: SyslogLevel,
79}
80
81impl ExecutionMessage {
82    pub fn new(level: SyslogLevel, message: impl Into<String>) -> Self {
83        Self {
84            message: message.into(),
85            level,
86        }
87    }
88
89    pub fn from_syslog(syslog_level: i32, message: impl Into<String>) -> Self {
90        Self::new(SyslogLevel::from_raw(syslog_level), message)
91    }
92
93    pub fn is_error(&self) -> bool {
94        self.level.is_error_or_worse()
95    }
96
97    pub fn is_warning(&self) -> bool {
98        matches!(self.level, SyslogLevel::Warning)
99    }
100
101    pub fn is_warning_or_worse(&self) -> bool {
102        self.level
103            .is_warning_or_worse()
104    }
105}
106
107impl std::fmt::Display for ExecutionMessage {
108    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
109        write!(f, "[{}] {}", self.level, self.message)
110    }
111}