use std::fmt;
use std::str::FromStr;
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
#[repr(u8)]
pub enum Facility {
KERN = 0,
USER = 1,
MAIL = 2,
DAEMON = 3,
AUTH = 4,
SYSLOG = 5,
LPR = 6,
NEWS = 7,
UUCP = 8,
CRON = 9,
AUTHPRIV = 10,
FTP = 11,
NTP = 12,
AUDIT = 13,
ALERT = 14,
CLOCK = 15,
LOCAL0 = 16,
LOCAL1 = 17,
LOCAL2 = 18,
LOCAL3 = 19,
LOCAL4 = 20,
LOCAL5 = 21,
LOCAL6 = 22,
LOCAL7 = 23,
}
impl Default for Facility {
fn default() -> Self {
Facility::USER
}
}
impl Facility {
pub fn code(self) -> u8 {
self as u8
}
pub fn label(self) -> &'static str {
match self {
Facility::KERN => "KERN",
Facility::USER => "USER",
Facility::MAIL => "MAIL",
Facility::DAEMON => "DAEMON",
Facility::AUTH => "AUTH",
Facility::SYSLOG => "SYSLOG",
Facility::LPR => "LPR",
Facility::NEWS => "NEWS",
Facility::UUCP => "UUCP",
Facility::CRON => "CRON",
Facility::AUTHPRIV => "AUTHPRIV",
Facility::FTP => "FTP",
Facility::NTP => "NTP",
Facility::AUDIT => "AUDIT",
Facility::ALERT => "ALERT",
Facility::CLOCK => "CLOCK",
Facility::LOCAL0 => "LOCAL0",
Facility::LOCAL1 => "LOCAL1",
Facility::LOCAL2 => "LOCAL2",
Facility::LOCAL3 => "LOCAL3",
Facility::LOCAL4 => "LOCAL4",
Facility::LOCAL5 => "LOCAL5",
Facility::LOCAL6 => "LOCAL6",
Facility::LOCAL7 => "LOCAL7",
}
}
}
impl TryFrom<u8> for Facility {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Facility::KERN),
1 => Ok(Facility::USER),
2 => Ok(Facility::MAIL),
3 => Ok(Facility::DAEMON),
4 => Ok(Facility::AUTH),
5 => Ok(Facility::SYSLOG),
6 => Ok(Facility::LPR),
7 => Ok(Facility::NEWS),
8 => Ok(Facility::UUCP),
9 => Ok(Facility::CRON),
10 => Ok(Facility::AUTHPRIV),
11 => Ok(Facility::FTP),
12 => Ok(Facility::NTP),
13 => Ok(Facility::AUDIT),
14 => Ok(Facility::ALERT),
15 => Ok(Facility::CLOCK),
16 => Ok(Facility::LOCAL0),
17 => Ok(Facility::LOCAL1),
18 => Ok(Facility::LOCAL2),
19 => Ok(Facility::LOCAL3),
20 => Ok(Facility::LOCAL4),
21 => Ok(Facility::LOCAL5),
22 => Ok(Facility::LOCAL6),
23 => Ok(Facility::LOCAL7),
_ => Err(()),
}
}
}
impl TryFrom<&str> for Facility {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
match &value.to_lowercase()[..] {
"kern" => Ok(Facility::KERN),
"user" => Ok(Facility::USER),
"mail" => Ok(Facility::MAIL),
"daemon" => Ok(Facility::DAEMON),
"auth" => Ok(Facility::AUTH),
"syslog" => Ok(Facility::SYSLOG),
"lpr" => Ok(Facility::LPR),
"news" => Ok(Facility::NEWS),
"uucp" => Ok(Facility::UUCP),
"cron" => Ok(Facility::CRON),
"authpriv" => Ok(Facility::AUTHPRIV),
"ftp" => Ok(Facility::FTP),
"ntp" => Ok(Facility::NTP),
"audit" => Ok(Facility::AUDIT),
"alert" => Ok(Facility::ALERT),
"clock" => Ok(Facility::CLOCK),
"local0" => Ok(Facility::LOCAL0),
"local1" => Ok(Facility::LOCAL1),
"local2" => Ok(Facility::LOCAL2),
"local3" => Ok(Facility::LOCAL3),
"local4" => Ok(Facility::LOCAL4),
"local5" => Ok(Facility::LOCAL5),
"local6" => Ok(Facility::LOCAL6),
"local7" => Ok(Facility::LOCAL7),
_ => Err(()),
}
}
}
impl FromStr for Facility {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::try_from(s)
}
}
impl fmt::Display for Facility {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.label())
}
}