use std::sync::Arc;
use crate::application::service::CompensationChangeService;
use crate::application::service::PayrollEntryService;
use crate::application::service::SalarySlipService;
use crate::application::service::SalarySlipLineService;
use crate::application::service::SalaryStructureService;
use crate::application::service::SalaryComponentService;
#[derive(Clone)]
pub struct AppState {
pub compensation_change_service: Arc<CompensationChangeService>,
pub payroll_entry_service: Arc<PayrollEntryService>,
pub salary_slip_service: Arc<SalarySlipService>,
pub salary_slip_line_service: Arc<SalarySlipLineService>,
pub salary_structure_service: Arc<SalaryStructureService>,
pub salary_component_service: Arc<SalaryComponentService>,
}
impl AppState {
pub fn new(
compensation_change_service: Arc<CompensationChangeService>,
payroll_entry_service: Arc<PayrollEntryService>,
salary_slip_service: Arc<SalarySlipService>,
salary_slip_line_service: Arc<SalarySlipLineService>,
salary_structure_service: Arc<SalaryStructureService>,
salary_component_service: Arc<SalaryComponentService>
) -> Self {
Self {
compensation_change_service,
payroll_entry_service,
salary_slip_service,
salary_slip_line_service,
salary_structure_service,
salary_component_service,
}
}
pub fn from_module(module: &crate::PayrollModule) -> Self {
Self {
compensation_change_service: module.compensation_change_service.clone(),
payroll_entry_service: module.payroll_entry_service.clone(),
salary_slip_service: module.salary_slip_service.clone(),
salary_slip_line_service: module.salary_slip_line_service.clone(),
salary_structure_service: module.salary_structure_service.clone(),
salary_component_service: module.salary_component_service.clone(),
}
}
}
#[derive(Default)]
pub struct AppStateBuilder {
compensation_change_service: Option<Arc<CompensationChangeService>>,
payroll_entry_service: Option<Arc<PayrollEntryService>>,
salary_slip_service: Option<Arc<SalarySlipService>>,
salary_slip_line_service: Option<Arc<SalarySlipLineService>>,
salary_structure_service: Option<Arc<SalaryStructureService>>,
salary_component_service: Option<Arc<SalaryComponentService>>,
}
impl AppStateBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_compensation_change_service(mut self, service: Arc<CompensationChangeService>) -> Self {
self.compensation_change_service = Some(service);
self
}
pub fn with_payroll_entry_service(mut self, service: Arc<PayrollEntryService>) -> Self {
self.payroll_entry_service = Some(service);
self
}
pub fn with_salary_slip_service(mut self, service: Arc<SalarySlipService>) -> Self {
self.salary_slip_service = Some(service);
self
}
pub fn with_salary_slip_line_service(mut self, service: Arc<SalarySlipLineService>) -> Self {
self.salary_slip_line_service = Some(service);
self
}
pub fn with_salary_structure_service(mut self, service: Arc<SalaryStructureService>) -> Self {
self.salary_structure_service = Some(service);
self
}
pub fn with_salary_component_service(mut self, service: Arc<SalaryComponentService>) -> Self {
self.salary_component_service = Some(service);
self
}
pub fn build(self) -> AppState {
AppState {
compensation_change_service: self.compensation_change_service.expect("compensation_change_service is required"),
payroll_entry_service: self.payroll_entry_service.expect("payroll_entry_service is required"),
salary_slip_service: self.salary_slip_service.expect("salary_slip_service is required"),
salary_slip_line_service: self.salary_slip_line_service.expect("salary_slip_line_service is required"),
salary_structure_service: self.salary_structure_service.expect("salary_structure_service is required"),
salary_component_service: self.salary_component_service.expect("salary_component_service is required"),
}
}
}