use std::{
fmt::{Display, Formatter},
num::NonZeroU32,
};
#[cfg(feature = "arbitrary")]
use arbitrary::Arbitrary;
#[cfg(feature = "bounded-static")]
use bounded_static::ToStatic;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{
body::BodyStructure,
core::{AString, NString, NonEmptyVec},
datetime::DateTime,
envelope::Envelope,
flag::FlagFetch,
};
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Macro {
Fast,
All,
Full,
}
impl Macro {
pub fn expand(&self) -> Vec<MessageDataItemName> {
use MessageDataItemName::*;
match self {
Self::All => vec![Flags, InternalDate, Rfc822Size, Envelope],
Self::Fast => vec![Flags, InternalDate, Rfc822Size],
Self::Full => vec![Flags, InternalDate, Rfc822Size, Envelope, Body],
}
}
}
impl Display for Macro {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
Macro::All => "ALL",
Macro::Fast => "FAST",
Macro::Full => "FULL",
})
}
}
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum MacroOrMessageDataItemNames<'a> {
Macro(Macro),
MessageDataItemNames(Vec<MessageDataItemName<'a>>),
}
impl<'a> From<Macro> for MacroOrMessageDataItemNames<'a> {
fn from(m: Macro) -> Self {
MacroOrMessageDataItemNames::Macro(m)
}
}
impl<'a> From<Vec<MessageDataItemName<'a>>> for MacroOrMessageDataItemNames<'a> {
fn from(item_names: Vec<MessageDataItemName<'a>>) -> Self {
MacroOrMessageDataItemNames::MessageDataItemNames(item_names)
}
}
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[doc(alias = "FetchAttribute")]
pub enum MessageDataItemName<'a> {
Body,
BodyExt {
section: Option<Section<'a>>,
partial: Option<(u32, NonZeroU32)>,
peek: bool,
},
BodyStructure,
Envelope,
Flags,
InternalDate,
Rfc822,
Rfc822Header,
Rfc822Size,
Rfc822Text,
Uid,
}
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[doc(alias = "FetchAttributeValue")]
pub enum MessageDataItem<'a> {
Body(BodyStructure<'a>),
BodyExt {
section: Option<Section<'a>>,
origin: Option<u32>,
data: NString<'a>,
},
BodyStructure(BodyStructure<'a>),
Envelope(Envelope<'a>),
Flags(Vec<FlagFetch<'a>>),
InternalDate(DateTime),
Rfc822(NString<'a>),
Rfc822Header(NString<'a>),
Rfc822Size(u32),
Rfc822Text(NString<'a>),
Uid(NonZeroU32),
}
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Section<'a> {
Part(Part),
Header(Option<Part>),
HeaderFields(Option<Part>, NonEmptyVec<AString<'a>>),
HeaderFieldsNot(Option<Part>, NonEmptyVec<AString<'a>>),
Text(Option<Part>),
Mime(Part),
}
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Part(pub NonEmptyVec<NonZeroU32>);
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum PartSpecifier<'a> {
PartNumber(u32),
Header,
HeaderFields(NonEmptyVec<AString<'a>>),
HeaderFieldsNot(NonEmptyVec<AString<'a>>),
Mime,
Text,
}