email/folder/list/
imap.rs

1use async_trait::async_trait;
2use tracing::info;
3
4use super::{Folders, ListFolders};
5use crate::{imap::ImapContext, AnyResult};
6
7#[derive(Debug, Clone)]
8pub struct ListImapFolders {
9    ctx: ImapContext,
10}
11
12impl ListImapFolders {
13    pub fn new(ctx: &ImapContext) -> Self {
14        Self { ctx: ctx.clone() }
15    }
16
17    pub fn new_boxed(ctx: &ImapContext) -> Box<dyn ListFolders> {
18        Box::new(Self::new(ctx))
19    }
20
21    pub fn some_new_boxed(ctx: &ImapContext) -> Option<Box<dyn ListFolders>> {
22        Some(Self::new_boxed(ctx))
23    }
24}
25
26#[async_trait]
27impl ListFolders for ListImapFolders {
28    async fn list_folders(&self) -> AnyResult<Folders> {
29        info!("listing imap folders");
30
31        let config = &self.ctx.account_config;
32        let mut client = self.ctx.client().await;
33
34        let folders = client.list_all_mailboxes(config).await?;
35
36        Ok(folders)
37    }
38}