backbone-digest 0.3.0

KPI digests — the periodic KPI-email engine: a declarative name-keyed KPI registry other modules extend, per-recipient fenced rendering with declared (never row-count) KPI drops, the anti-spam slowdown ladder, a shared tips carousel, and a daily plain-pull cron whose due-date column is the queue (Odoo digest port)
//! Digest 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::DigestDigestService;
use crate::application::service::DigestSubscriptionService;
use crate::application::service::DigestDigestKpiService;
use crate::application::service::DigestTipService;
use crate::application::service::DigestTipUserService;

/// 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 {
    /// DigestDigest service
    pub digest_digest_service: Arc<DigestDigestService>,
    /// DigestSubscription service
    pub digest_subscription_service: Arc<DigestSubscriptionService>,
    /// DigestDigestKpi service
    pub digest_digest_kpi_service: Arc<DigestDigestKpiService>,
    /// DigestTip service
    pub digest_tip_service: Arc<DigestTipService>,
    /// DigestTipUser service
    pub digest_tip_user_service: Arc<DigestTipUserService>,
}

impl AppState {
    /// Create a new AppState with all services.
    pub fn new(
        digest_digest_service: Arc<DigestDigestService>,
        digest_subscription_service: Arc<DigestSubscriptionService>,
        digest_digest_kpi_service: Arc<DigestDigestKpiService>,
        digest_tip_service: Arc<DigestTipService>,
        digest_tip_user_service: Arc<DigestTipUserService>
    ) -> Self {
        Self {
            digest_digest_service,
            digest_subscription_service,
            digest_digest_kpi_service,
            digest_tip_service,
            digest_tip_user_service,
        }
    }

    /// Create AppState from module instance.
    pub fn from_module(module: &crate::DigestModule) -> Self {
        Self {
            digest_digest_service: module.digest_digest_service.clone(),
            digest_subscription_service: module.digest_subscription_service.clone(),
            digest_digest_kpi_service: module.digest_digest_kpi_service.clone(),
            digest_tip_service: module.digest_tip_service.clone(),
            digest_tip_user_service: module.digest_tip_user_service.clone(),
        }
    }
}

/// Builder for AppState.
///
/// Allows incremental construction of AppState.
#[derive(Default)]
pub struct AppStateBuilder {
    digest_digest_service: Option<Arc<DigestDigestService>>,
    digest_subscription_service: Option<Arc<DigestSubscriptionService>>,
    digest_digest_kpi_service: Option<Arc<DigestDigestKpiService>>,
    digest_tip_service: Option<Arc<DigestTipService>>,
    digest_tip_user_service: Option<Arc<DigestTipUserService>>,
}

impl AppStateBuilder {
    /// Create a new builder.
    pub fn new() -> Self {
        Self::default()
    }

    /// Set the DigestDigest service.
    pub fn with_digest_digest_service(mut self, service: Arc<DigestDigestService>) -> Self {
        self.digest_digest_service = Some(service);
        self
    }

    /// Set the DigestSubscription service.
    pub fn with_digest_subscription_service(mut self, service: Arc<DigestSubscriptionService>) -> Self {
        self.digest_subscription_service = Some(service);
        self
    }

    /// Set the DigestDigestKpi service.
    pub fn with_digest_digest_kpi_service(mut self, service: Arc<DigestDigestKpiService>) -> Self {
        self.digest_digest_kpi_service = Some(service);
        self
    }

    /// Set the DigestTip service.
    pub fn with_digest_tip_service(mut self, service: Arc<DigestTipService>) -> Self {
        self.digest_tip_service = Some(service);
        self
    }

    /// Set the DigestTipUser service.
    pub fn with_digest_tip_user_service(mut self, service: Arc<DigestTipUserService>) -> Self {
        self.digest_tip_user_service = Some(service);
        self
    }

    /// Build the AppState.
    ///
    /// # Panics
    ///
    /// Panics if any required service is not set.
    pub fn build(self) -> AppState {
        AppState {
            digest_digest_service: self.digest_digest_service.expect("digest_digest_service is required"),
            digest_subscription_service: self.digest_subscription_service.expect("digest_subscription_service is required"),
            digest_digest_kpi_service: self.digest_digest_kpi_service.expect("digest_digest_kpi_service is required"),
            digest_tip_service: self.digest_tip_service.expect("digest_tip_service is required"),
            digest_tip_user_service: self.digest_tip_user_service.expect("digest_tip_user_service is required"),
        }
    }
}