use crate::{mail::*, smtp::*};
use std::ops::{Add, AddAssign};
#[derive(Default, Debug)]
pub struct Builder;
impl<T: MailSetup<Configuration>> Add<T> for Builder {
type Output = BuilderWithConfig;
fn add(self, setup: T) -> Self::Output {
BuilderWithConfig::default() + setup
}
}
impl Builder {
pub fn empty() -> BuilderWithConfig {
BuilderWithConfig::default()
}
pub fn using(self, setup: impl MailSetup<Configuration>) -> BuilderWithConfig {
BuilderWithConfig::default() + setup
}
#[cfg(feature = "driver")]
pub fn build(self) -> Service {
BuilderWithConfig::default().build()
}
}
#[derive(Default)]
pub struct BuilderWithConfig {
config: Configuration,
}
impl<T: MailSetup<Configuration>> Add<T> for BuilderWithConfig {
type Output = Self;
fn add(mut self, setup: T) -> Self::Output {
self += setup;
self
}
}
impl<T: MailSetup<Configuration>> AddAssign<T> for BuilderWithConfig {
fn add_assign(&mut self, setup: T) {
trace!(
"Service builder {} using setup {:?}",
self.config.id(),
setup
);
setup.setup(&mut self.config)
}
}
impl BuilderWithConfig {
pub fn using(self, setup: impl MailSetup<Configuration>) -> Self {
self + setup
}
#[cfg(feature = "driver")]
pub fn build(self) -> Service {
self.build_with_driver(crate::smtp::SmtpDriver)
}
pub fn build_with_driver(self, driver: impl Drive + Send + Sync + 'static) -> Service {
self.config.into_service(driver)
}
}