use io_maildir::{
coroutine::*,
maildir::create::{
MaildirCreate as InnerMaildirCreate, MaildirCreateError as InnerMaildirCreateError,
},
store::MaildirStore,
};
use log::trace;
use thiserror::Error;
use crate::maildir::convert::{InvalidMailboxName, mailbox_path};
#[derive(Debug, Error)]
pub enum MaildirMailboxCreateError {
#[error(transparent)]
Create(#[from] InnerMaildirCreateError),
#[error(transparent)]
InvalidMailbox(#[from] InvalidMailboxName),
}
pub struct MaildirMailboxCreate {
inner: InnerMaildirCreate,
}
impl MaildirMailboxCreate {
pub fn new(store: &MaildirStore, name: &str) -> Result<Self, MaildirMailboxCreateError> {
trace!("prepare Maildir mailbox create");
let path = mailbox_path(name)?;
Ok(Self {
inner: InnerMaildirCreate::new(store, path),
})
}
}
impl MaildirCoroutine for MaildirMailboxCreate {
type Yield = MaildirYield;
type Return = Result<(), MaildirMailboxCreateError>;
fn resume(
&mut self,
arg: Option<MaildirReply>,
) -> MaildirCoroutineState<Self::Yield, Self::Return> {
match self.inner.resume(arg) {
MaildirCoroutineState::Yielded(y) => MaildirCoroutineState::Yielded(y),
MaildirCoroutineState::Complete(r) => {
MaildirCoroutineState::Complete(r.map_err(Into::into))
}
}
}
}