Skip to main content

io_email/message/m2dir/
delete.rs

1//! m2dir message-delete coroutine wrapping
2//! [`io_m2dir::entry::delete::M2dirEntryDelete`]: removes the entry
3//! and every .meta/\<id\>.* sidecar.
4//!
5//! # Example
6//!
7//! ```rust,ignore
8//! use io_email::message::m2dir::delete::M2dirMessageDelete;
9//!
10//! client.run(M2dirMessageDelete::new(&client.root, "INBOX", "msg-id")?)?;
11//! ```
12
13use std::path::PathBuf;
14
15use io_m2dir::{
16    coroutine::*,
17    entry::delete::{
18        M2dirEntryDelete as InnerDelete, M2dirEntryDeleteError as InnerErr,
19        M2dirEntryDeleteOptions as InnerOpts,
20    },
21};
22use log::trace;
23use thiserror::Error;
24
25use crate::m2dir::convert::{InvalidMailboxName, resolve_mailbox};
26
27/// Errors produced by [`M2dirMessageDelete`].
28#[derive(Debug, Error)]
29pub enum M2dirMessageDeleteError {
30    #[error(transparent)]
31    Delete(#[from] InnerErr),
32    #[error(transparent)]
33    InvalidMailbox(#[from] InvalidMailboxName),
34}
35
36/// I/O-free coroutine deleting a single m2dir message.
37pub struct M2dirMessageDelete {
38    inner: InnerDelete,
39}
40
41impl M2dirMessageDelete {
42    pub fn new(
43        root: impl Into<PathBuf>,
44        mailbox: &str,
45        id: &str,
46    ) -> Result<Self, M2dirMessageDeleteError> {
47        trace!("prepare m2dir message delete");
48        let m2dir = resolve_mailbox(root, mailbox)?;
49        Ok(Self {
50            inner: InnerDelete::new(m2dir, id, InnerOpts::default()),
51        })
52    }
53}
54
55impl M2dirCoroutine for M2dirMessageDelete {
56    type Yield = M2dirYield;
57    type Return = Result<(), M2dirMessageDeleteError>;
58
59    fn resume(&mut self, arg: Option<M2dirArg>) -> M2dirCoroutineState<Self::Yield, Self::Return> {
60        match self.inner.resume(arg) {
61            M2dirCoroutineState::Yielded(y) => M2dirCoroutineState::Yielded(y),
62            M2dirCoroutineState::Complete(r) => {
63                M2dirCoroutineState::Complete(r.map_err(Into::into))
64            }
65        }
66    }
67}