use std::sync::Arc;
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;
#[derive(Clone)]
pub struct AppState {
pub attribute_service: Arc<AttributeService>,
pub attribute_value_service: Arc<AttributeValueService>,
pub brand_service: Arc<BrandService>,
pub item_service: Arc<ItemService>,
pub item_group_service: Arc<ItemGroupService>,
pub item_variant_service: Arc<ItemVariantService>,
pub uom_service: Arc<UomService>,
pub uom_conversion_service: Arc<UomConversionService>,
}
impl AppState {
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,
}
}
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(),
}
}
}
#[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 {
pub fn new() -> Self {
Self::default()
}
pub fn with_attribute_service(mut self, service: Arc<AttributeService>) -> Self {
self.attribute_service = Some(service);
self
}
pub fn with_attribute_value_service(mut self, service: Arc<AttributeValueService>) -> Self {
self.attribute_value_service = Some(service);
self
}
pub fn with_brand_service(mut self, service: Arc<BrandService>) -> Self {
self.brand_service = Some(service);
self
}
pub fn with_item_service(mut self, service: Arc<ItemService>) -> Self {
self.item_service = Some(service);
self
}
pub fn with_item_group_service(mut self, service: Arc<ItemGroupService>) -> Self {
self.item_group_service = Some(service);
self
}
pub fn with_item_variant_service(mut self, service: Arc<ItemVariantService>) -> Self {
self.item_variant_service = Some(service);
self
}
pub fn with_uom_service(mut self, service: Arc<UomService>) -> Self {
self.uom_service = Some(service);
self
}
pub fn with_uom_conversion_service(mut self, service: Arc<UomConversionService>) -> Self {
self.uom_conversion_service = Some(service);
self
}
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"),
}
}
}