email/folder/
maildir.rs

1//! Module dedicated to Maildir email folders.
2//!
3//! This module contains folder-related mapping functions from the
4//! [maildirpp] crate types.
5
6use maildirs::Maildir;
7
8use crate::{
9    account::config::AccountConfig,
10    folder::{Folder, Folders},
11    maildir::MaildirContext,
12};
13
14use super::Result;
15
16impl Folders {
17    /// Parse folders from submaildirs.
18    ///
19    /// Folders are parsed in parallel, using [`rayon`]. Only parses
20    /// direct submaildirs (no recursion).
21    pub fn from_maildir_context(ctx: &MaildirContext) -> Self {
22        Folders::from_iter(ctx.root.iter().map(|entry| {
23            Folder {
24                kind: ctx
25                    .account_config
26                    .find_folder_kind_from_alias(&entry.name)
27                    .or_else(|| entry.name.parse().ok()),
28                name: entry.name,
29                desc: entry.maildir.path().display().to_string(),
30            }
31        }))
32    }
33}
34
35impl Folder {
36    /// Parse a folder from a maildir instance.
37    ///
38    /// Returns [`None`] in case the folder name is too short (does
39    /// not start by a dot) or is equal to `notmuch` (which should not
40    /// be treated as a maildir folder).
41    pub fn try_from_maildir(config: &AccountConfig, mdir: Maildir) -> Result<Self> {
42        let name = mdir.name()?.to_owned();
43        let kind = config
44            .find_folder_kind_from_alias(&name)
45            .or_else(|| name.parse().ok());
46        let desc = mdir.path().display().to_string();
47
48        Ok(Folder { kind, name, desc })
49    }
50}