use std::path::PathBuf;
use io_m2dir::{
coroutine::*,
m2dir::create::{
M2dirCreate as InnerCreate, M2dirCreateError as InnerErr, M2dirCreateOptions as InnerOpts,
},
store::M2dirStoreError,
};
use log::trace;
use thiserror::Error;
use crate::m2dir::convert::store_from_root;
#[derive(Debug, Error)]
pub enum M2dirMailboxCreateError {
#[error(transparent)]
Create(#[from] InnerErr),
#[error(transparent)]
InvalidMailbox(#[from] M2dirStoreError),
}
pub struct M2dirMailboxCreate {
inner: InnerCreate,
}
impl M2dirMailboxCreate {
pub fn new(root: impl Into<PathBuf>, name: &str) -> Result<Self, M2dirMailboxCreateError> {
trace!("prepare m2dir mailbox create");
let store = store_from_root(root);
let inner = InnerCreate::new(&store, name, InnerOpts::default())?;
Ok(Self { inner })
}
}
impl M2dirCoroutine for M2dirMailboxCreate {
type Yield = M2dirYield;
type Return = Result<(), M2dirMailboxCreateError>;
fn resume(&mut self, arg: Option<M2dirArg>) -> M2dirCoroutineState<Self::Yield, Self::Return> {
match self.inner.resume(arg) {
M2dirCoroutineState::Yielded(y) => M2dirCoroutineState::Yielded(y),
M2dirCoroutineState::Complete(Ok(_m2dir)) => M2dirCoroutineState::Complete(Ok(())),
M2dirCoroutineState::Complete(Err(err)) => {
M2dirCoroutineState::Complete(Err(err.into()))
}
}
}
}