use {Error, NILVALUE};
#[derive(Debug, Clone, Copy)]
pub enum Facility {
Kernel = 0,
User = 1,
Mail = 2,
Daemon = 3,
Auth = 4,
Syslog = 5,
LinePrinter = 6,
News = 7,
UUCP = 8,
Cron = 9,
AuthPriv = 10,
FTP = 11,
NTP = 12,
Security = 13,
Console = 14,
ClockDaemon = 15,
Local0 = 16,
Local1 = 17,
Local2 = 18,
Local3 = 19,
Local4 = 20,
Local5 = 21,
Local6 = 22,
Local7 = 23,
}
impl Default for Facility {
fn default() -> Facility {
Facility::User
}
}
#[derive(Debug, Clone, Copy)]
pub enum Severity {
Emergency = 0,
Alert = 1,
Critical = 2,
Error = 3,
Warning = 4,
Notice = 5,
Informational = 6,
Debug = 7,
}
#[derive(Debug, Clone)]
pub enum Message {
Text(String),
Binary(Vec<u8>),
}
#[derive(Debug)]
pub struct HostName(pub String);
impl HostName {
pub fn new(hostname: &str) -> Result<HostName, Error> {
Ok(HostName(new_header_val(hostname, 255)?))
}
}
impl Default for HostName {
fn default() -> HostName {
HostName(format!("{}", NILVALUE))
}
}
#[derive(Debug)]
pub struct AppName(pub String);
impl AppName {
pub fn new(name: &str) -> Result<AppName, Error> {
Ok(AppName(new_header_val(name, 48)?))
}
}
impl Default for AppName {
fn default() -> AppName {
AppName(format!("{}", NILVALUE))
}
}
#[derive(Debug)]
pub struct ProcessId(pub String);
impl ProcessId {
pub fn new(id: &str) -> Result<ProcessId, Error> {
Ok(ProcessId(new_header_val(id, 128)?))
}
}
impl Default for ProcessId {
fn default() -> ProcessId {
ProcessId(format!("{}", NILVALUE))
}
}
#[derive(Debug)]
pub struct MessageId(pub String);
impl MessageId {
pub fn new(id: &str) -> Result<MessageId, Error> {
Ok(MessageId(new_header_val(id, 32)?))
}
}
impl Default for MessageId {
fn default() -> MessageId {
MessageId(format!("{}", NILVALUE))
}
}
fn new_header_val(value: &str, max_length: usize) -> Result<String, Error> {
if value.is_empty() {
return Err(Error::FieldEmpty);
}
if !value.chars().all(|x| x.is_ascii_graphic()) {
return Err(Error::InvalidCharacters);
}
if value.len() > max_length {
return Err(Error::FieldTooLong);
}
Ok(value.to_string())
}
#[inline]
pub fn escape_val(val: &str) -> String {
val.replace('\\', r#"\\"#)
.replace('"', r#"\""#)
.replace(']', r#"\]"#)
}
#[inline]
pub fn remove_invalid(name: &str) -> String {
name.chars()
.filter(char::is_ascii_graphic)
.filter(|c| *c != '=')
.filter(|c| *c != ' ')
.filter(|c| *c != ']')
.filter(|c| *c != '"')
.take(32)
.collect()
}