pub mod parser;
#[cfg(test)]
mod tests;
use crate::utils::parsec::*;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RuleBlock(pub Vec<Rule>);
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ActionCommand {
Keep,
Fileinto { mailbox: String },
Redirect { address: String },
Discard,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ControlCommand {
Stop,
Require(Vec<String>),
If {
condition: (ConditionRule, RuleBlock),
elsif: Option<Box<(ConditionRule, RuleBlock)>>,
else_: Option<RuleBlock>,
},
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Rule {
Block(RuleBlock),
Action(ActionCommand),
Control(ControlCommand),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum AddressOperator {
All,
Localpart,
Domain,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum IntegerOperator {
Over,
Under,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum RelationalMatch {
Gt,
Ge,
Lt,
Le,
Eq,
Ne,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum MatchOperator {
Is,
Matches,
Contains,
Count(RelationalMatch),
Value(RelationalMatch),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CharacterOperator {
Octet,
AsciiCasemap,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ZoneRule {
Year,
Month,
Day,
Date,
Julian,
Hour,
Minute,
Second,
Time,
Iso8601,
Std11,
Zone,
Weekday,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ConditionRule {
AnyOf(Vec<Self>),
AllOf(Vec<Self>),
Exists(Vec<String>),
Header {
comparator: Option<CharacterOperator>,
match_operator: Option<MatchOperator>,
header_names: Vec<String>,
key_list: Vec<String>,
},
Date {
comparator: Option<CharacterOperator>,
match_type: Option<MatchOperator>,
zone: ZoneRule,
header_name: String,
date_part: String,
key_list: Vec<String>,
},
Address {
comparator: Option<CharacterOperator>,
address_part: Option<AddressOperator>,
match_type: Option<MatchOperator>,
header_list: Vec<String>,
key_list: Vec<String>,
},
Not(Box<Self>),
Size {
operator: IntegerOperator,
limit: u64,
},
Literal(bool),
}