use crate::message::body::{
compiler::tokens::Prop, ALTERNATIVE, CHARSET, CREATION_DATE, DATA_ENCODING, DESCRIPTION,
DISPOSITION, ENCODING, FILENAME, MIXED, MODIFICATION_DATE, NAME, READ_DATE, RECIPIENT_FILENAME,
RELATED, SIZE, TYPE,
};
#[cfg(feature = "pgp")]
use crate::message::body::{ENCRYPT, RECIPIENTS, SENDER, SIGN};
use super::{maybe_quoted_const_val, prelude::*, quoted_val, val};
pub(crate) fn multipart_type<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(TYPE)
.labelled(TYPE)
.then_ignore(just('=').padded())
.then(choice((
maybe_quoted_const_val(MIXED).labelled(MIXED),
maybe_quoted_const_val(ALTERNATIVE).labelled(ALTERNATIVE),
maybe_quoted_const_val(RELATED).labelled(RELATED),
)))
.padded()
}
pub(crate) fn part_type<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(TYPE)
.labelled(TYPE)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn filename<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(FILENAME)
.labelled(FILENAME)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn recipient_filename<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone
{
just(RECIPIENT_FILENAME)
.labelled(RECIPIENT_FILENAME)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn charset<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(CHARSET)
.labelled(CHARSET)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn name<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(NAME)
.labelled(NAME)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn disposition<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(DISPOSITION)
.labelled(DISPOSITION)
.then_ignore(just('=').padded())
.then(choice((inline(), attachment())))
.padded()
}
pub(crate) fn encoding<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(ENCODING)
.labelled(ENCODING)
.then_ignore(just('=').padded())
.then(choice((
encoding_7bit(),
encoding_8bit(),
encoding_quoted_printable(),
encoding_base64(),
)))
.padded()
}
pub(crate) fn data_encoding<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(DATA_ENCODING)
.labelled(DATA_ENCODING)
.then_ignore(just('=').padded())
.then(choice((encoding_quoted_printable(), encoding_base64())))
.padded()
}
pub(crate) fn description<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(DESCRIPTION)
.labelled(DESCRIPTION)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn creation_date<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(CREATION_DATE)
.labelled(CREATION_DATE)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn modification_date<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone
{
just(MODIFICATION_DATE)
.labelled(MODIFICATION_DATE)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn read_date<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(READ_DATE)
.labelled(READ_DATE)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
#[cfg(feature = "pgp")]
pub(crate) fn recipients<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(RECIPIENTS)
.labelled(RECIPIENTS)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
#[cfg(feature = "pgp")]
pub(crate) fn sender<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(SENDER)
.labelled(SENDER)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
pub(crate) fn size<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(SIZE)
.labelled(SIZE)
.then_ignore(just('=').padded())
.then(choice((quoted_val(), val().to_slice())))
.padded()
}
#[cfg(feature = "pgp")]
pub(crate) fn sign<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(SIGN)
.labelled(SIGN)
.then_ignore(just('=').padded())
.then(pgp_mime())
.padded()
}
#[cfg(feature = "pgp")]
pub(crate) fn encrypt<'a>() -> impl Parser<'a, &'a str, Prop<'a>, ParserError<'a>> + Clone {
just(ENCRYPT)
.labelled(ENCRYPT)
.then_ignore(just('=').padded())
.then(pgp_mime())
.padded()
}