Better choose wether or not a body is required

This commit is contained in:
Quentin 2024-01-08 21:32:55 +01:00
parent a90f425d32
commit 056f8ea14c
Signed by: quentin
GPG Key ID: E9602264D639FF68
3 changed files with 30 additions and 25 deletions

View File

@ -1,4 +1,4 @@
use imap_codec::imap_types::fetch::{MacroOrMessageDataItemNames, MessageDataItemName};
use imap_codec::imap_types::fetch::{MacroOrMessageDataItemNames, MessageDataItemName, Section};
/// Internal decisions based on fetched attributes
/// passed by the client
@ -36,14 +36,26 @@ impl AttributesProxy {
pub fn need_body(&self) -> bool {
self.attrs.iter().any(|x| {
matches!(
x,
println!("item is: {:?}", x);
match x {
MessageDataItemName::Body
| MessageDataItemName::BodyExt { .. }
| MessageDataItemName::Rfc822
| MessageDataItemName::Rfc822Text
| MessageDataItemName::BodyStructure
)
| MessageDataItemName::Rfc822
| MessageDataItemName::Rfc822Text
| MessageDataItemName::BodyStructure => true,
MessageDataItemName::BodyExt {
section: Some(section),
partial: _,
peek: _,
} => match section {
Section::Header(None)
| Section::HeaderFields(None, _)
| Section::HeaderFieldsNot(None, _) => false,
_ => true,
},
MessageDataItemName::BodyExt { .. } => true,
_ => false,
}
})
}
}

View File

@ -32,10 +32,7 @@ pub struct MailView<'a> {
}
impl<'a> MailView<'a> {
pub fn new(
query_result: &'a QueryResult,
in_idx: &'a MailIndex<'a>,
) -> Result<MailView<'a>> {
pub fn new(query_result: &'a QueryResult, in_idx: &'a MailIndex<'a>) -> Result<MailView<'a>> {
Ok(Self {
in_idx,
query_result,

View File

@ -31,8 +31,12 @@ impl QueryScope {
impl<'a, 'b> Query<'a, 'b> {
pub async fn fetch(&self) -> Result<Vec<QueryResult>> {
match self.scope {
QueryScope::Index => Ok(self.emails.iter().map(|&uuid| QueryResult::IndexResult { uuid }).collect()),
QueryScope::Partial =>self.partial().await,
QueryScope::Index => Ok(self
.emails
.iter()
.map(|&uuid| QueryResult::IndexResult { uuid })
.collect()),
QueryScope::Partial => self.partial().await,
QueryScope::Full => self.full().await,
}
}
@ -44,9 +48,7 @@ impl<'a, 'b> Query<'a, 'b> {
let result = meta
.into_iter()
.zip(self.emails.iter())
.map(|(metadata, &uuid)| {
QueryResult::PartialResult { uuid, metadata }
})
.map(|(metadata, &uuid)| QueryResult::PartialResult { uuid, metadata })
.collect::<Vec<_>>();
Ok(result)
@ -125,20 +127,14 @@ impl QueryResult {
fn into_partial(self, metadata: MailMeta) -> Option<Self> {
match self {
Self::IndexResult { uuid } => Some(Self::PartialResult {
uuid,
metadata,
}),
Self::IndexResult { uuid } => Some(Self::PartialResult { uuid, metadata }),
_ => None,
}
}
fn into_full(self, content: Vec<u8>) -> Option<Self> {
match self {
Self::PartialResult {
uuid,
metadata,
} => Some(Self::FullResult {
Self::PartialResult { uuid, metadata } => Some(Self::FullResult {
uuid,
metadata,
content,