mirror of https://git.meli.delivery/meli/meli
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
421 lines
14 KiB
Rust
421 lines
14 KiB
Rust
/*
|
|
* Copyright (c) 2020-2023, Stalwart Labs Ltd.
|
|
*
|
|
* This file is part of the Stalwart Sieve Interpreter.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
* in the LICENSE file at the top-level directory of this distribution.
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* You can be released from the requirements of the AGPLv3 license by
|
|
* purchasing a commercial license. Please contact licensing@stalw.art
|
|
* for more details.
|
|
*/
|
|
|
|
use std::fmt::Display;
|
|
|
|
use phf::phf_map;
|
|
|
|
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
|
pub(crate) enum Word {
|
|
AddFlag,
|
|
AddHeader,
|
|
Address,
|
|
Addresses,
|
|
All,
|
|
AllOf,
|
|
AnyChild,
|
|
AnyOf,
|
|
Body,
|
|
Break,
|
|
ByMode,
|
|
ByTimeAbsolute,
|
|
ByTimeRelative,
|
|
ByTrace,
|
|
Comparator,
|
|
Contains,
|
|
Content,
|
|
ContentType,
|
|
Convert,
|
|
Copy,
|
|
Count,
|
|
Create,
|
|
CurrentDate,
|
|
Date,
|
|
Days,
|
|
DeleteHeader,
|
|
Detail,
|
|
Discard,
|
|
Domain,
|
|
Duplicate,
|
|
Else,
|
|
ElsIf,
|
|
Enclose,
|
|
EncodeUrl,
|
|
Envelope,
|
|
Environment,
|
|
Ereject,
|
|
Error,
|
|
Exists,
|
|
ExtractText,
|
|
False,
|
|
Fcc,
|
|
FileInto,
|
|
First,
|
|
Flags,
|
|
ForEveryPart,
|
|
From,
|
|
Global,
|
|
Handle,
|
|
HasFlag,
|
|
Header,
|
|
Headers,
|
|
If,
|
|
Ihave,
|
|
Importance,
|
|
Include,
|
|
Index,
|
|
Is,
|
|
Keep,
|
|
Last,
|
|
Length,
|
|
List,
|
|
LocalPart,
|
|
Lower,
|
|
LowerFirst,
|
|
MailboxExists,
|
|
MailboxId,
|
|
MailboxIdExists,
|
|
Matches,
|
|
Message,
|
|
Metadata,
|
|
MetadataExists,
|
|
Mime,
|
|
Name,
|
|
Not,
|
|
Notify,
|
|
NotifyMethodCapability,
|
|
Once,
|
|
Optional,
|
|
Options,
|
|
OriginalZone,
|
|
Over,
|
|
Param,
|
|
Percent,
|
|
Personal,
|
|
QuoteRegex,
|
|
QuoteWildcard,
|
|
Raw,
|
|
Redirect,
|
|
Regex,
|
|
Reject,
|
|
RemoveFlag,
|
|
Replace,
|
|
Require,
|
|
Ret,
|
|
Return,
|
|
Seconds,
|
|
ServerMetadata,
|
|
ServerMetadataExists,
|
|
Set,
|
|
SetFlag,
|
|
Size,
|
|
SpamTest,
|
|
SpecialUse,
|
|
SpecialUseExists,
|
|
Stop,
|
|
String,
|
|
Subject,
|
|
Subtype,
|
|
Text,
|
|
True,
|
|
Type,
|
|
Under,
|
|
UniqueId,
|
|
Upper,
|
|
UpperFirst,
|
|
User,
|
|
Vacation,
|
|
ValidExtList,
|
|
ValidNotifyMethod,
|
|
Value,
|
|
VirusTest,
|
|
Zone,
|
|
|
|
// Extensions
|
|
Eval,
|
|
Local,
|
|
ForEveryLine,
|
|
}
|
|
|
|
pub(crate) static WORDS: phf::Map<&'static str, Word> = phf_map! {
|
|
"addflag" => Word::AddFlag,
|
|
"addheader" => Word::AddHeader,
|
|
"address" => Word::Address,
|
|
"addresses" => Word::Addresses,
|
|
"all" => Word::All,
|
|
"allof" => Word::AllOf,
|
|
"anychild" => Word::AnyChild,
|
|
"anyof" => Word::AnyOf,
|
|
"body" => Word::Body,
|
|
"break" => Word::Break,
|
|
"bymode" => Word::ByMode,
|
|
"bytimeabsolute" => Word::ByTimeAbsolute,
|
|
"bytimerelative" => Word::ByTimeRelative,
|
|
"bytrace" => Word::ByTrace,
|
|
"comparator" => Word::Comparator,
|
|
"contains" => Word::Contains,
|
|
"content" => Word::Content,
|
|
"contenttype" => Word::ContentType,
|
|
"convert" => Word::Convert,
|
|
"copy" => Word::Copy,
|
|
"count" => Word::Count,
|
|
"create" => Word::Create,
|
|
"currentdate" => Word::CurrentDate,
|
|
"date" => Word::Date,
|
|
"days" => Word::Days,
|
|
"deleteheader" => Word::DeleteHeader,
|
|
"detail" => Word::Detail,
|
|
"discard" => Word::Discard,
|
|
"domain" => Word::Domain,
|
|
"duplicate" => Word::Duplicate,
|
|
"else" => Word::Else,
|
|
"elsif" => Word::ElsIf,
|
|
"enclose" => Word::Enclose,
|
|
"encodeurl" => Word::EncodeUrl,
|
|
"envelope" => Word::Envelope,
|
|
"environment" => Word::Environment,
|
|
"ereject" => Word::Ereject,
|
|
"error" => Word::Error,
|
|
"exists" => Word::Exists,
|
|
"extracttext" => Word::ExtractText,
|
|
"false" => Word::False,
|
|
"fcc" => Word::Fcc,
|
|
"fileinto" => Word::FileInto,
|
|
"first" => Word::First,
|
|
"flags" => Word::Flags,
|
|
"foreverypart" => Word::ForEveryPart,
|
|
"from" => Word::From,
|
|
"global" => Word::Global,
|
|
"handle" => Word::Handle,
|
|
"hasflag" => Word::HasFlag,
|
|
"header" => Word::Header,
|
|
"headers" => Word::Headers,
|
|
"if" => Word::If,
|
|
"ihave" => Word::Ihave,
|
|
"importance" => Word::Importance,
|
|
"include" => Word::Include,
|
|
"index" => Word::Index,
|
|
"is" => Word::Is,
|
|
"keep" => Word::Keep,
|
|
"last" => Word::Last,
|
|
"length" => Word::Length,
|
|
"list" => Word::List,
|
|
"localpart" => Word::LocalPart,
|
|
"lower" => Word::Lower,
|
|
"lowerfirst" => Word::LowerFirst,
|
|
"mailboxexists" => Word::MailboxExists,
|
|
"mailboxid" => Word::MailboxId,
|
|
"mailboxidexists" => Word::MailboxIdExists,
|
|
"matches" => Word::Matches,
|
|
"message" => Word::Message,
|
|
"metadata" => Word::Metadata,
|
|
"metadataexists" => Word::MetadataExists,
|
|
"mime" => Word::Mime,
|
|
"name" => Word::Name,
|
|
"not" => Word::Not,
|
|
"notify" => Word::Notify,
|
|
"notify_method_capability" => Word::NotifyMethodCapability,
|
|
"once" => Word::Once,
|
|
"optional" => Word::Optional,
|
|
"options" => Word::Options,
|
|
"originalzone" => Word::OriginalZone,
|
|
"over" => Word::Over,
|
|
"param" => Word::Param,
|
|
"percent" => Word::Percent,
|
|
"personal" => Word::Personal,
|
|
"quoteregex" => Word::QuoteRegex,
|
|
"quotewildcard" => Word::QuoteWildcard,
|
|
"raw" => Word::Raw,
|
|
"redirect" => Word::Redirect,
|
|
"regex" => Word::Regex,
|
|
"reject" => Word::Reject,
|
|
"removeflag" => Word::RemoveFlag,
|
|
"replace" => Word::Replace,
|
|
"require" => Word::Require,
|
|
"ret" => Word::Ret,
|
|
"return" => Word::Return,
|
|
"seconds" => Word::Seconds,
|
|
"servermetadata" => Word::ServerMetadata,
|
|
"servermetadataexists" => Word::ServerMetadataExists,
|
|
"set" => Word::Set,
|
|
"setflag" => Word::SetFlag,
|
|
"size" => Word::Size,
|
|
"spamtest" => Word::SpamTest,
|
|
"specialuse" => Word::SpecialUse,
|
|
"specialuse_exists" => Word::SpecialUseExists,
|
|
"stop" => Word::Stop,
|
|
"string" => Word::String,
|
|
"subject" => Word::Subject,
|
|
"subtype" => Word::Subtype,
|
|
"text" => Word::Text,
|
|
"true" => Word::True,
|
|
"type" => Word::Type,
|
|
"under" => Word::Under,
|
|
"uniqueid" => Word::UniqueId,
|
|
"upper" => Word::Upper,
|
|
"upperfirst" => Word::UpperFirst,
|
|
"user" => Word::User,
|
|
"vacation" => Word::Vacation,
|
|
"valid_ext_list" => Word::ValidExtList,
|
|
"valid_notify_method" => Word::ValidNotifyMethod,
|
|
"value" => Word::Value,
|
|
"virustest" => Word::VirusTest,
|
|
"zone" => Word::Zone,
|
|
"eval" => Word::Eval,
|
|
"local" => Word::Local,
|
|
"foreveryline" => Word::ForEveryLine,
|
|
};
|
|
|
|
impl Display for Word {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
match self {
|
|
Word::AddFlag => f.write_str("addflag"),
|
|
Word::AddHeader => f.write_str("addheader"),
|
|
Word::Address => f.write_str("address"),
|
|
Word::Addresses => f.write_str("addresses"),
|
|
Word::All => f.write_str("all"),
|
|
Word::AllOf => f.write_str("allof"),
|
|
Word::AnyChild => f.write_str("anychild"),
|
|
Word::AnyOf => f.write_str("anyof"),
|
|
Word::Body => f.write_str("body"),
|
|
Word::Break => f.write_str("break"),
|
|
Word::ByMode => f.write_str("bymode"),
|
|
Word::ByTimeAbsolute => f.write_str("bytimeabsolute"),
|
|
Word::ByTimeRelative => f.write_str("bytimerelative"),
|
|
Word::ByTrace => f.write_str("bytrace"),
|
|
Word::Comparator => f.write_str("comparator"),
|
|
Word::Contains => f.write_str("contains"),
|
|
Word::Content => f.write_str("content"),
|
|
Word::ContentType => f.write_str("contenttype"),
|
|
Word::Convert => f.write_str("convert"),
|
|
Word::Copy => f.write_str("copy"),
|
|
Word::Count => f.write_str("count"),
|
|
Word::Create => f.write_str("create"),
|
|
Word::CurrentDate => f.write_str("currentdate"),
|
|
Word::Date => f.write_str("date"),
|
|
Word::Days => f.write_str("days"),
|
|
Word::DeleteHeader => f.write_str("deleteheader"),
|
|
Word::Detail => f.write_str("detail"),
|
|
Word::Discard => f.write_str("discard"),
|
|
Word::Domain => f.write_str("domain"),
|
|
Word::Duplicate => f.write_str("duplicate"),
|
|
Word::Else => f.write_str("else"),
|
|
Word::ElsIf => f.write_str("elsif"),
|
|
Word::Enclose => f.write_str("enclose"),
|
|
Word::EncodeUrl => f.write_str("encodeurl"),
|
|
Word::Envelope => f.write_str("envelope"),
|
|
Word::Environment => f.write_str("environment"),
|
|
Word::Ereject => f.write_str("ereject"),
|
|
Word::Error => f.write_str("error"),
|
|
Word::Exists => f.write_str("exists"),
|
|
Word::ExtractText => f.write_str("extracttext"),
|
|
Word::False => f.write_str("false"),
|
|
Word::Fcc => f.write_str("fcc"),
|
|
Word::FileInto => f.write_str("fileinto"),
|
|
Word::First => f.write_str("first"),
|
|
Word::Flags => f.write_str("flags"),
|
|
Word::ForEveryPart => f.write_str("foreverypart"),
|
|
Word::From => f.write_str("from"),
|
|
Word::Global => f.write_str("global"),
|
|
Word::Handle => f.write_str("handle"),
|
|
Word::HasFlag => f.write_str("hasflag"),
|
|
Word::Header => f.write_str("header"),
|
|
Word::Headers => f.write_str("headers"),
|
|
Word::If => f.write_str("if"),
|
|
Word::Ihave => f.write_str("ihave"),
|
|
Word::Importance => f.write_str("importance"),
|
|
Word::Include => f.write_str("include"),
|
|
Word::Index => f.write_str("index"),
|
|
Word::Is => f.write_str("is"),
|
|
Word::Keep => f.write_str("keep"),
|
|
Word::Last => f.write_str("last"),
|
|
Word::Length => f.write_str("length"),
|
|
Word::List => f.write_str("list"),
|
|
Word::LocalPart => f.write_str("localpart"),
|
|
Word::Lower => f.write_str("lower"),
|
|
Word::LowerFirst => f.write_str("lowerfirst"),
|
|
Word::MailboxExists => f.write_str("mailboxexists"),
|
|
Word::MailboxId => f.write_str("mailboxid"),
|
|
Word::MailboxIdExists => f.write_str("mailboxidexists"),
|
|
Word::Matches => f.write_str("matches"),
|
|
Word::Message => f.write_str("message"),
|
|
Word::Metadata => f.write_str("metadata"),
|
|
Word::MetadataExists => f.write_str("metadataexists"),
|
|
Word::Mime => f.write_str("mime"),
|
|
Word::Name => f.write_str("name"),
|
|
Word::Not => f.write_str("not"),
|
|
Word::Notify => f.write_str("notify"),
|
|
Word::NotifyMethodCapability => f.write_str("notify_method_capability"),
|
|
Word::Once => f.write_str("once"),
|
|
Word::Optional => f.write_str("optional"),
|
|
Word::Options => f.write_str("options"),
|
|
Word::OriginalZone => f.write_str("originalzone"),
|
|
Word::Over => f.write_str("over"),
|
|
Word::Param => f.write_str("param"),
|
|
Word::Percent => f.write_str("percent"),
|
|
Word::Personal => f.write_str("personal"),
|
|
Word::QuoteRegex => f.write_str("quoteregex"),
|
|
Word::QuoteWildcard => f.write_str("quotewildcard"),
|
|
Word::Raw => f.write_str("raw"),
|
|
Word::Redirect => f.write_str("redirect"),
|
|
Word::Regex => f.write_str("regex"),
|
|
Word::Reject => f.write_str("reject"),
|
|
Word::RemoveFlag => f.write_str("removeflag"),
|
|
Word::Replace => f.write_str("replace"),
|
|
Word::Require => f.write_str("require"),
|
|
Word::Ret => f.write_str("ret"),
|
|
Word::Return => f.write_str("return"),
|
|
Word::Seconds => f.write_str("seconds"),
|
|
Word::ServerMetadata => f.write_str("servermetadata"),
|
|
Word::ServerMetadataExists => f.write_str("servermetadataexists"),
|
|
Word::Set => f.write_str("set"),
|
|
Word::SetFlag => f.write_str("setflag"),
|
|
Word::Size => f.write_str("size"),
|
|
Word::SpamTest => f.write_str("spamtest"),
|
|
Word::SpecialUse => f.write_str("specialuse"),
|
|
Word::SpecialUseExists => f.write_str("specialuse_exists"),
|
|
Word::Stop => f.write_str("stop"),
|
|
Word::String => f.write_str("string"),
|
|
Word::Subject => f.write_str("subject"),
|
|
Word::Subtype => f.write_str("subtype"),
|
|
Word::Text => f.write_str("text"),
|
|
Word::True => f.write_str("true"),
|
|
Word::Type => f.write_str("type"),
|
|
Word::Under => f.write_str("under"),
|
|
Word::UniqueId => f.write_str("uniqueid"),
|
|
Word::Upper => f.write_str("upper"),
|
|
Word::UpperFirst => f.write_str("upperfirst"),
|
|
Word::User => f.write_str("user"),
|
|
Word::Vacation => f.write_str("vacation"),
|
|
Word::ValidExtList => f.write_str("valid_ext_list"),
|
|
Word::ValidNotifyMethod => f.write_str("valid_notify_method"),
|
|
Word::Value => f.write_str("value"),
|
|
Word::VirusTest => f.write_str("virustest"),
|
|
Word::Zone => f.write_str("zone"),
|
|
Word::Eval => f.write_str("eval"),
|
|
Word::Local => f.write_str("local"),
|
|
Word::ForEveryLine => f.write_str("foreveryline"),
|
|
}
|
|
}
|
|
}
|