io_email/mailbox/maildir/
create.rs1use 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#[derive(Debug, Error)]
27pub enum MaildirMailboxCreateError {
28 #[error(transparent)]
29 Create(#[from] InnerMaildirCreateError),
30 #[error(transparent)]
31 InvalidMailbox(#[from] InvalidMailboxName),
32}
33
34pub 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}