Skip to main content

io_email/mailbox/m2dir/
delete.rs

1//! m2dir mailbox-delete coroutine wrapping
2//! [`io_m2dir::m2dir::delete::M2dirDelete`]: recursively removes the
3//! mailbox directory.
4//!
5//! # Example
6//!
7//! ```rust,ignore
8//! use io_email::mailbox::m2dir::delete::M2dirMailboxDelete;
9//!
10//! client.run(M2dirMailboxDelete::new(&client.root, "Archive")?)?;
11//! ```
12
13use std::path::PathBuf;
14
15use io_m2dir::{
16    coroutine::*,
17    m2dir::delete::{
18        M2dirDelete as InnerDelete, M2dirDeleteError as InnerErr, M2dirDeleteOptions as InnerOpts,
19    },
20};
21use log::trace;
22use thiserror::Error;
23
24use crate::m2dir::convert::{InvalidMailboxName, resolve_mailbox};
25
26/// Errors produced by [`M2dirMailboxDelete`].
27#[derive(Debug, Error)]
28pub enum M2dirMailboxDeleteError {
29    #[error(transparent)]
30    Delete(#[from] InnerErr),
31    #[error(transparent)]
32    InvalidMailbox(#[from] InvalidMailboxName),
33}
34
35/// I/O-free coroutine deleting an m2dir mailbox under the store root.
36pub struct M2dirMailboxDelete {
37    inner: InnerDelete,
38}
39
40impl M2dirMailboxDelete {
41    pub fn new(root: impl Into<PathBuf>, name: &str) -> Result<Self, M2dirMailboxDeleteError> {
42        trace!("prepare m2dir mailbox delete");
43        let m2dir = resolve_mailbox(root, name)?;
44        Ok(Self {
45            inner: InnerDelete::new(m2dir.path().clone(), InnerOpts::default()),
46        })
47    }
48}
49
50impl M2dirCoroutine for M2dirMailboxDelete {
51    type Yield = M2dirYield;
52    type Return = Result<(), M2dirMailboxDeleteError>;
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(r) => {
58                M2dirCoroutineState::Complete(r.map_err(Into::into))
59            }
60        }
61    }
62}