backbone-mailing 0.6.0

Email marketing — mass-mail engine: audiences, subscriptions, hand-set mailing lifecycle, seeded A/B testing, per-recipient traces, cycle-44 bridge targets (Odoo mass_mailing port)
//! Mailing Module Handlers
//!
//! Generated by metaphor-schema. Do not edit manually.
//!
//! This module provides:
//! - AppState dependency injection container
//! - Custom handler integration points

use std::sync::Arc;

// Import all services
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;

/// Application state for dependency injection.
///
/// This struct holds references to all module services
/// and is passed to HTTP handlers via Axum's State extractor.
///
/// # Example
///
/// ```ignore
/// use axum::extract::State;
///
/// async fn custom_handler(
///     State(state): State<AppState>,
/// ) -> impl IntoResponse {
///     // Access services via state
/// }
/// ```
#[derive(Clone)]
pub struct AppState {
    /// MailingAbTest service
    pub mailing_ab_test_service: Arc<MailingAbTestService>,
    /// MailingAudience service
    pub mailing_audience_service: Arc<MailingAudienceService>,
    /// MailingContact service
    pub mailing_contact_service: Arc<MailingContactService>,
    /// MailingSubscription service
    pub mailing_subscription_service: Arc<MailingSubscriptionService>,
    /// OptOutReason service
    pub opt_out_reason_service: Arc<OptOutReasonService>,
    /// Mailing service
    pub mailing_service: Arc<MailingService>,
    /// MailingTrace service
    pub mailing_trace_service: Arc<MailingTraceService>,
    /// MailingFilter service
    pub mailing_filter_service: Arc<MailingFilterService>,
}

impl AppState {
    /// Create a new AppState with all services.
    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,
        }
    }

    /// Create AppState from module instance.
    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(),
        }
    }
}

/// Builder for AppState.
///
/// Allows incremental construction of AppState.
#[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 {
    /// Create a new builder.
    pub fn new() -> Self {
        Self::default()
    }

    /// Set the MailingAbTest service.
    pub fn with_mailing_ab_test_service(mut self, service: Arc<MailingAbTestService>) -> Self {
        self.mailing_ab_test_service = Some(service);
        self
    }

    /// Set the MailingAudience service.
    pub fn with_mailing_audience_service(mut self, service: Arc<MailingAudienceService>) -> Self {
        self.mailing_audience_service = Some(service);
        self
    }

    /// Set the MailingContact service.
    pub fn with_mailing_contact_service(mut self, service: Arc<MailingContactService>) -> Self {
        self.mailing_contact_service = Some(service);
        self
    }

    /// Set the MailingSubscription service.
    pub fn with_mailing_subscription_service(mut self, service: Arc<MailingSubscriptionService>) -> Self {
        self.mailing_subscription_service = Some(service);
        self
    }

    /// Set the OptOutReason service.
    pub fn with_opt_out_reason_service(mut self, service: Arc<OptOutReasonService>) -> Self {
        self.opt_out_reason_service = Some(service);
        self
    }

    /// Set the Mailing service.
    pub fn with_mailing_service(mut self, service: Arc<MailingService>) -> Self {
        self.mailing_service = Some(service);
        self
    }

    /// Set the MailingTrace service.
    pub fn with_mailing_trace_service(mut self, service: Arc<MailingTraceService>) -> Self {
        self.mailing_trace_service = Some(service);
        self
    }

    /// Set the MailingFilter service.
    pub fn with_mailing_filter_service(mut self, service: Arc<MailingFilterService>) -> Self {
        self.mailing_filter_service = Some(service);
        self
    }

    /// Build the AppState.
    ///
    /// # Panics
    ///
    /// Panics if any required service is not set.
    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"),
        }
    }
}