Skip to main content

io_email/mailbox/m2dir/
create.rs

1//! m2dir mailbox-create coroutine wrapping
2//! [`io_m2dir::m2dir::create::M2dirCreate`]: creates the mailbox
3//! directory plus the .m2dir marker and .meta/ sidecar.
4//!
5//! # Example
6//!
7//! ```rust,ignore
8//! use io_email::mailbox::m2dir::create::M2dirMailboxCreate;
9//!
10//! client.run(M2dirMailboxCreate::new(&client.root, "Archive")?)?;
11//! ```
12
13use std::path::PathBuf;
14
15use io_m2dir::{
16    coroutine::*,
17    m2dir::create::{
18        M2dirCreate as InnerCreate, M2dirCreateError as InnerErr, M2dirCreateOptions as InnerOpts,
19    },
20    store::M2dirStoreError,
21};
22use log::trace;
23use thiserror::Error;
24
25use crate::m2dir::convert::store_from_root;
26
27/// Errors produced by [`M2dirMailboxCreate`].
28#[derive(Debug, Error)]
29pub enum M2dirMailboxCreateError {
30    #[error(transparent)]
31    Create(#[from] InnerErr),
32    #[error(transparent)]
33    InvalidMailbox(#[from] M2dirStoreError),
34}
35
36/// I/O-free coroutine creating an m2dir mailbox under the store root.
37pub struct M2dirMailboxCreate {
38    inner: InnerCreate,
39}
40
41impl M2dirMailboxCreate {
42    pub fn new(root: impl Into<PathBuf>, name: &str) -> Result<Self, M2dirMailboxCreateError> {
43        trace!("prepare m2dir mailbox create");
44        let store = store_from_root(root);
45        let inner = InnerCreate::new(&store, name, InnerOpts::default())?;
46        Ok(Self { inner })
47    }
48}
49
50impl M2dirCoroutine for M2dirMailboxCreate {
51    type Yield = M2dirYield;
52    type Return = Result<(), M2dirMailboxCreateError>;
53
54    fn resume(&mut self, arg: Option<M2dirArg>) -> M2dirCoroutineState<Self::Yield, Self::Return> {
55        match self.inner.resume(arg) {
56            M2dirCoroutineState::Yielded(y) => M2dirCoroutineState::Yielded(y),
57            M2dirCoroutineState::Complete(Ok(_m2dir)) => M2dirCoroutineState::Complete(Ok(())),
58            M2dirCoroutineState::Complete(Err(err)) => {
59                M2dirCoroutineState::Complete(Err(err.into()))
60            }
61        }
62    }
63}