Skip to main content

io_email/mailbox/maildir/
create.rs

1//! Maildir mailbox-create coroutine wrapping
2//! [`io_maildir::maildir::create::MaildirCreate`]: creates the
3//! mailbox dir with its cur/new/tmp triad under the [`MaildirStore`].
4//!
5//! # Example
6//!
7//! ```rust,ignore
8//! use io_email::mailbox::maildir::create::MaildirMailboxCreate;
9//!
10//! client.run(MaildirMailboxCreate::new(&client.store, "Archive")?)?;
11//! ```
12
13use io_maildir::{
14    coroutine::*,
15    maildir::create::{
16        MaildirCreate as InnerMaildirCreate, MaildirCreateError as InnerMaildirCreateError,
17    },
18    store::MaildirStore,
19};
20use log::trace;
21use thiserror::Error;
22
23use crate::maildir::convert::{InvalidMailboxName, mailbox_path};
24
25/// Errors produced by [`MaildirMailboxCreate`].
26#[derive(Debug, Error)]
27pub enum MaildirMailboxCreateError {
28    #[error(transparent)]
29    Create(#[from] InnerMaildirCreateError),
30    #[error(transparent)]
31    InvalidMailbox(#[from] InvalidMailboxName),
32}
33
34/// I/O-free coroutine creating a Maildir mailbox under the store.
35pub struct MaildirMailboxCreate {
36    inner: InnerMaildirCreate,
37}
38
39impl MaildirMailboxCreate {
40    pub fn new(store: &MaildirStore, name: &str) -> Result<Self, MaildirMailboxCreateError> {
41        trace!("prepare Maildir mailbox create");
42        let path = mailbox_path(name)?;
43        Ok(Self {
44            inner: InnerMaildirCreate::new(store, path),
45        })
46    }
47}
48
49impl MaildirCoroutine for MaildirMailboxCreate {
50    type Yield = MaildirYield;
51    type Return = Result<(), MaildirMailboxCreateError>;
52
53    fn resume(
54        &mut self,
55        arg: Option<MaildirReply>,
56    ) -> MaildirCoroutineState<Self::Yield, Self::Return> {
57        match self.inner.resume(arg) {
58            MaildirCoroutineState::Yielded(y) => MaildirCoroutineState::Yielded(y),
59            MaildirCoroutineState::Complete(r) => {
60                MaildirCoroutineState::Complete(r.map_err(Into::into))
61            }
62        }
63    }
64}