forklaunch 1.15.0

Launch faster with forklaunch
use std::collections::HashSet;

use anyhow::{Result, bail};

use crate::constants::{Module, get_service_module_name};

#[derive(Debug, PartialEq, Eq)]
pub(crate) enum IamConfig {
    BetterAuthIam,
    BaseIam,
}

#[derive(Debug, PartialEq, Eq)]
pub(crate) enum BillingConfig {
    BaseBilling,
    StripeBilling,
}

#[derive(Debug, PartialEq, Eq)]
pub(crate) enum EcommerceConfig {
    StripeEcommerce,
}

#[derive(Debug, PartialEq, Eq)]
pub(crate) enum MessagingConfig {
    BaseMessaging,
    TwilioMessaging,
}

#[derive(Debug, PartialEq, Eq)]
pub(crate) enum CacConfig {
    BaseCac,
}

#[derive(Debug, PartialEq, Eq)]
pub(crate) enum RelayConfig {
    Relay,
}

#[derive(Debug, PartialEq, Eq, Default)]
pub(crate) struct ModuleConfig {
    pub(crate) iam: Option<IamConfig>,
    pub(crate) billing: Option<BillingConfig>,
    pub(crate) ecommerce: Option<EcommerceConfig>,
    pub(crate) messaging: Option<MessagingConfig>,
    pub(crate) cac: Option<CacConfig>,
    pub(crate) relay: Option<RelayConfig>,
}

pub(crate) fn validate_modules(
    modules: &Vec<Module>,
    global_module_config: &mut ModuleConfig,
) -> Result<()> {
    let mut module_conflict_set = HashSet::new();

    for module in modules {
        match module {
            Module::BetterAuthIam => {
                global_module_config.iam = Some(IamConfig::BetterAuthIam);
            }
            Module::BaseIam => {
                global_module_config.iam = Some(IamConfig::BaseIam);
            }
            Module::BaseBilling => {
                global_module_config.billing = Some(BillingConfig::BaseBilling);
            }
            Module::StripeBilling => {
                global_module_config.billing = Some(BillingConfig::StripeBilling);
            }
            Module::StripeEcommerce => {
                global_module_config.ecommerce = Some(EcommerceConfig::StripeEcommerce);
            }
            Module::BaseMessaging => {
                global_module_config.messaging = Some(MessagingConfig::BaseMessaging);
            }
            Module::TwilioMessaging => {
                global_module_config.messaging = Some(MessagingConfig::TwilioMessaging);
            }
            Module::BaseCac => {
                global_module_config.cac = Some(CacConfig::BaseCac);
            }
            Module::Relay => {
                global_module_config.relay = Some(RelayConfig::Relay);
            }
        }

        let module_type = get_service_module_name(module);

        if module_conflict_set.contains(&module_type) {
            bail!("Module conflict");
        }

        module_conflict_set.insert(module_type);
    }

    Ok(())
}