#[cfg(feature = "arbitrary")]
use arbitrary::Arbitrary;
#[cfg(feature = "bounded-static")]
use bounded_static::ToStatic;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{
core::{IString, NString, NonEmptyVec},
envelope::Envelope,
};
#[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 Body<'a> {
pub basic: BasicFields<'a>,
pub specific: SpecificFields<'a>,
}
#[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 BasicFields<'a> {
pub parameter_list: Vec<(IString<'a>, IString<'a>)>,
pub id: NString<'a>,
pub description: NString<'a>,
pub content_transfer_encoding: IString<'a>,
pub size: u32,
}
#[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 SpecificFields<'a> {
Basic {
r#type: IString<'a>,
subtype: IString<'a>,
},
Message {
envelope: Box<Envelope<'a>>,
body_structure: Box<BodyStructure<'a>>,
number_of_lines: u32,
},
Text {
subtype: IString<'a>,
number_of_lines: u32,
},
}
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum BodyStructure<'a> {
Single {
body: Body<'a>,
extension_data: Option<SinglePartExtensionData<'a>>,
},
Multi {
bodies: NonEmptyVec<BodyStructure<'a>>,
subtype: IString<'a>,
extension_data: Option<MultiPartExtensionData<'a>>,
},
}
#[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 SinglePartExtensionData<'a> {
pub md5: NString<'a>,
pub tail: Option<Disposition<'a>>,
}
#[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 MultiPartExtensionData<'a> {
pub parameter_list: Vec<(IString<'a>, IString<'a>)>,
pub tail: Option<Disposition<'a>>,
}
#[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 Disposition<'a> {
pub disposition: Option<(IString<'a>, Vec<(IString<'a>, IString<'a>)>)>,
pub tail: Option<Language<'a>>,
}
#[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 Language<'a> {
pub language: Vec<IString<'a>>,
pub tail: Option<Location<'a>>,
}
#[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 Location<'a> {
pub location: NString<'a>,
pub extensions: Vec<BodyExtension<'a>>,
}
#[cfg_attr(feature = "bounded-static", derive(ToStatic))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum BodyExtension<'a> {
NString(NString<'a>),
Number(u32),
List(NonEmptyVec<BodyExtension<'a>>),
}