1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
#[cfg(feature = "bounded-static")]
use bounded_static::ToStatic;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{
core::{AString, Atom, NonEmptyVec},
datetime::NaiveDate,
sequence::SequenceSet,
};
/// The defined search keys.
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum SearchKey<'a> {
// <Not in RFC.>
//
// IMAP doesn't have a dedicated AND operator in its search syntax.
// ANDing multiple search keys works by concatenating them with an ascii space.
// Introducing this variant makes sense, because
// * it may help in understanding the RFC
// * and it can be used to distinguish between a single search key
// and multiple search keys.
//
// See also the corresponding `search` parser.
And(NonEmptyVec<SearchKey<'a>>),
/// Messages with message sequence numbers corresponding to the
/// specified message sequence number set.
SequenceSet(SequenceSet),
/// All messages in the mailbox; the default initial key for ANDing.
All,
/// Messages with the \Answered flag set.
Answered,
/// Messages that contain the specified string in the envelope
/// structure's BCC field.
Bcc(AString<'a>),
/// Messages whose internal date (disregarding time and timezone)
/// is earlier than the specified date.
Before(NaiveDate),
/// Messages that contain the specified string in the body of the
/// message.
Body(AString<'a>),
/// Messages that contain the specified string in the envelope
/// structure's CC field.
Cc(AString<'a>),
/// Messages with the \Deleted flag set.
Deleted,
/// Messages with the \Draft flag set.
Draft,
/// Messages with the \Flagged flag set.
Flagged,
/// Messages that contain the specified string in the envelope
/// structure's FROM field.
From(AString<'a>),
/// Messages that have a header with the specified field-name (as
/// defined in [RFC-2822]) and that contains the specified string
/// in the text of the header (what comes after the colon). If the
/// string to search is zero-length, this matches all messages that
/// have a header line with the specified field-name regardless of
/// the contents.
Header(AString<'a>, AString<'a>),
/// Messages with the specified keyword flag set.
Keyword(Atom<'a>),
/// Messages with an [RFC-2822] size larger than the specified
/// number of octets.
Larger(u32),
/// Messages that have the \Recent flag set but not the \Seen flag.
/// This is functionally equivalent to "(RECENT UNSEEN)".
New,
/// Messages that do not match the specified search key.
Not(Box<SearchKey<'a>>),
/// Messages that do not have the \Recent flag set. This is
/// functionally equivalent to "NOT RECENT" (as opposed to "NOT
/// NEW").
Old,
/// Messages whose internal date (disregarding time and timezone)
/// is within the specified date.
On(NaiveDate),
/// Messages that match either search key.
Or(Box<SearchKey<'a>>, Box<SearchKey<'a>>),
/// Messages that have the \Recent flag set.
Recent,
/// Messages that have the \Seen flag set.
Seen,
/// Messages whose [RFC-2822] Date: header (disregarding time and
/// timezone) is earlier than the specified date.
SentBefore(NaiveDate),
/// Messages whose [RFC-2822] Date: header (disregarding time and
/// timezone) is within the specified date.
SentOn(NaiveDate),
/// Messages whose [RFC-2822] Date: header (disregarding time and
/// timezone) is within or later than the specified date.
SentSince(NaiveDate),
/// Messages whose internal date (disregarding time and timezone)
/// is within or later than the specified date.
Since(NaiveDate),
/// Messages with an [RFC-2822] size smaller than the specified
/// number of octets.
Smaller(u32),
/// Messages that contain the specified string in the envelope
/// structure's SUBJECT field.
Subject(AString<'a>),
/// Messages that contain the specified string in the header or
/// body of the message.
Text(AString<'a>),
/// Messages that contain the specified string in the envelope
/// structure's TO field.
To(AString<'a>),
/// Messages with unique identifiers corresponding to the specified
/// unique identifier set. Sequence set ranges are permitted.
Uid(SequenceSet),
/// Messages that do not have the \Answered flag set.
Unanswered,
/// Messages that do not have the \Deleted flag set.
Undeleted,
/// Messages that do not have the \Draft flag set.
Undraft,
/// Messages that do not have the \Flagged flag set.
Unflagged,
/// Messages that do not have the specified keyword flag set.
Unkeyword(Atom<'a>),
/// Messages that do not have the \Seen flag set.
Unseen,
}
impl<'a> SearchKey<'a> {
pub fn uid<S>(sequence_set: S) -> Self
where
S: Into<SequenceSet>,
{
Self::Uid(sequence_set.into())
}
}