use std::sync::Arc;
use crate::application::service::MailingAbTestService;
use crate::application::service::MailingAudienceService;
use crate::application::service::MailingContactService;
use crate::application::service::MailingSubscriptionService;
use crate::application::service::OptOutReasonService;
use crate::application::service::MailingService;
use crate::application::service::MailingTraceService;
use crate::application::service::MailingFilterService;
#[derive(Clone)]
pub struct AppState {
pub mailing_ab_test_service: Arc<MailingAbTestService>,
pub mailing_audience_service: Arc<MailingAudienceService>,
pub mailing_contact_service: Arc<MailingContactService>,
pub mailing_subscription_service: Arc<MailingSubscriptionService>,
pub opt_out_reason_service: Arc<OptOutReasonService>,
pub mailing_service: Arc<MailingService>,
pub mailing_trace_service: Arc<MailingTraceService>,
pub mailing_filter_service: Arc<MailingFilterService>,
}
impl AppState {
pub fn new(
mailing_ab_test_service: Arc<MailingAbTestService>,
mailing_audience_service: Arc<MailingAudienceService>,
mailing_contact_service: Arc<MailingContactService>,
mailing_subscription_service: Arc<MailingSubscriptionService>,
opt_out_reason_service: Arc<OptOutReasonService>,
mailing_service: Arc<MailingService>,
mailing_trace_service: Arc<MailingTraceService>,
mailing_filter_service: Arc<MailingFilterService>
) -> Self {
Self {
mailing_ab_test_service,
mailing_audience_service,
mailing_contact_service,
mailing_subscription_service,
opt_out_reason_service,
mailing_service,
mailing_trace_service,
mailing_filter_service,
}
}
pub fn from_module(module: &crate::MailingModule) -> Self {
Self {
mailing_ab_test_service: module.mailing_ab_test_service.clone(),
mailing_audience_service: module.mailing_audience_service.clone(),
mailing_contact_service: module.mailing_contact_service.clone(),
mailing_subscription_service: module.mailing_subscription_service.clone(),
opt_out_reason_service: module.opt_out_reason_service.clone(),
mailing_service: module.mailing_service.clone(),
mailing_trace_service: module.mailing_trace_service.clone(),
mailing_filter_service: module.mailing_filter_service.clone(),
}
}
}
#[derive(Default)]
pub struct AppStateBuilder {
mailing_ab_test_service: Option<Arc<MailingAbTestService>>,
mailing_audience_service: Option<Arc<MailingAudienceService>>,
mailing_contact_service: Option<Arc<MailingContactService>>,
mailing_subscription_service: Option<Arc<MailingSubscriptionService>>,
opt_out_reason_service: Option<Arc<OptOutReasonService>>,
mailing_service: Option<Arc<MailingService>>,
mailing_trace_service: Option<Arc<MailingTraceService>>,
mailing_filter_service: Option<Arc<MailingFilterService>>,
}
impl AppStateBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_mailing_ab_test_service(mut self, service: Arc<MailingAbTestService>) -> Self {
self.mailing_ab_test_service = Some(service);
self
}
pub fn with_mailing_audience_service(mut self, service: Arc<MailingAudienceService>) -> Self {
self.mailing_audience_service = Some(service);
self
}
pub fn with_mailing_contact_service(mut self, service: Arc<MailingContactService>) -> Self {
self.mailing_contact_service = Some(service);
self
}
pub fn with_mailing_subscription_service(mut self, service: Arc<MailingSubscriptionService>) -> Self {
self.mailing_subscription_service = Some(service);
self
}
pub fn with_opt_out_reason_service(mut self, service: Arc<OptOutReasonService>) -> Self {
self.opt_out_reason_service = Some(service);
self
}
pub fn with_mailing_service(mut self, service: Arc<MailingService>) -> Self {
self.mailing_service = Some(service);
self
}
pub fn with_mailing_trace_service(mut self, service: Arc<MailingTraceService>) -> Self {
self.mailing_trace_service = Some(service);
self
}
pub fn with_mailing_filter_service(mut self, service: Arc<MailingFilterService>) -> Self {
self.mailing_filter_service = Some(service);
self
}
pub fn build(self) -> AppState {
AppState {
mailing_ab_test_service: self.mailing_ab_test_service.expect("mailing_ab_test_service is required"),
mailing_audience_service: self.mailing_audience_service.expect("mailing_audience_service is required"),
mailing_contact_service: self.mailing_contact_service.expect("mailing_contact_service is required"),
mailing_subscription_service: self.mailing_subscription_service.expect("mailing_subscription_service is required"),
opt_out_reason_service: self.opt_out_reason_service.expect("opt_out_reason_service is required"),
mailing_service: self.mailing_service.expect("mailing_service is required"),
mailing_trace_service: self.mailing_trace_service.expect("mailing_trace_service is required"),
mailing_filter_service: self.mailing_filter_service.expect("mailing_filter_service is required"),
}
}
}