backbone-catalog 0.7.0

Canonical product/service identity: Item, Item Group, UOM (Indonesia-first)
Documentation
//! Catalog 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::AttributeService;
use crate::application::service::AttributeValueService;
use crate::application::service::BrandService;
use crate::application::service::ItemService;
use crate::application::service::ItemGroupService;
use crate::application::service::ItemVariantService;
use crate::application::service::UomService;
use crate::application::service::UomConversionService;

/// 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 {
    /// Attribute service
    pub attribute_service: Arc<AttributeService>,
    /// AttributeValue service
    pub attribute_value_service: Arc<AttributeValueService>,
    /// Brand service
    pub brand_service: Arc<BrandService>,
    /// Item service
    pub item_service: Arc<ItemService>,
    /// ItemGroup service
    pub item_group_service: Arc<ItemGroupService>,
    /// ItemVariant service
    pub item_variant_service: Arc<ItemVariantService>,
    /// Uom service
    pub uom_service: Arc<UomService>,
    /// UomConversion service
    pub uom_conversion_service: Arc<UomConversionService>,
}

impl AppState {
    /// Create a new AppState with all services.
    pub fn new(
        attribute_service: Arc<AttributeService>,
        attribute_value_service: Arc<AttributeValueService>,
        brand_service: Arc<BrandService>,
        item_service: Arc<ItemService>,
        item_group_service: Arc<ItemGroupService>,
        item_variant_service: Arc<ItemVariantService>,
        uom_service: Arc<UomService>,
        uom_conversion_service: Arc<UomConversionService>
    ) -> Self {
        Self {
            attribute_service,
            attribute_value_service,
            brand_service,
            item_service,
            item_group_service,
            item_variant_service,
            uom_service,
            uom_conversion_service,
        }
    }

    /// Create AppState from module instance.
    pub fn from_module(module: &crate::CatalogModule) -> Self {
        Self {
            attribute_service: module.attribute_service.clone(),
            attribute_value_service: module.attribute_value_service.clone(),
            brand_service: module.brand_service.clone(),
            item_service: module.item_service.clone(),
            item_group_service: module.item_group_service.clone(),
            item_variant_service: module.item_variant_service.clone(),
            uom_service: module.uom_service.clone(),
            uom_conversion_service: module.uom_conversion_service.clone(),
        }
    }
}

/// Builder for AppState.
///
/// Allows incremental construction of AppState.
#[derive(Default)]
pub struct AppStateBuilder {
    attribute_service: Option<Arc<AttributeService>>,
    attribute_value_service: Option<Arc<AttributeValueService>>,
    brand_service: Option<Arc<BrandService>>,
    item_service: Option<Arc<ItemService>>,
    item_group_service: Option<Arc<ItemGroupService>>,
    item_variant_service: Option<Arc<ItemVariantService>>,
    uom_service: Option<Arc<UomService>>,
    uom_conversion_service: Option<Arc<UomConversionService>>,
}

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

    /// Set the Attribute service.
    pub fn with_attribute_service(mut self, service: Arc<AttributeService>) -> Self {
        self.attribute_service = Some(service);
        self
    }

    /// Set the AttributeValue service.
    pub fn with_attribute_value_service(mut self, service: Arc<AttributeValueService>) -> Self {
        self.attribute_value_service = Some(service);
        self
    }

    /// Set the Brand service.
    pub fn with_brand_service(mut self, service: Arc<BrandService>) -> Self {
        self.brand_service = Some(service);
        self
    }

    /// Set the Item service.
    pub fn with_item_service(mut self, service: Arc<ItemService>) -> Self {
        self.item_service = Some(service);
        self
    }

    /// Set the ItemGroup service.
    pub fn with_item_group_service(mut self, service: Arc<ItemGroupService>) -> Self {
        self.item_group_service = Some(service);
        self
    }

    /// Set the ItemVariant service.
    pub fn with_item_variant_service(mut self, service: Arc<ItemVariantService>) -> Self {
        self.item_variant_service = Some(service);
        self
    }

    /// Set the Uom service.
    pub fn with_uom_service(mut self, service: Arc<UomService>) -> Self {
        self.uom_service = Some(service);
        self
    }

    /// Set the UomConversion service.
    pub fn with_uom_conversion_service(mut self, service: Arc<UomConversionService>) -> Self {
        self.uom_conversion_service = Some(service);
        self
    }

    /// Build the AppState.
    ///
    /// # Panics
    ///
    /// Panics if any required service is not set.
    pub fn build(self) -> AppState {
        AppState {
            attribute_service: self.attribute_service.expect("attribute_service is required"),
            attribute_value_service: self.attribute_value_service.expect("attribute_value_service is required"),
            brand_service: self.brand_service.expect("brand_service is required"),
            item_service: self.item_service.expect("item_service is required"),
            item_group_service: self.item_group_service.expect("item_group_service is required"),
            item_variant_service: self.item_variant_service.expect("item_variant_service is required"),
            uom_service: self.uom_service.expect("uom_service is required"),
            uom_conversion_service: self.uom_conversion_service.expect("uom_conversion_service is required"),
        }
    }
}