forklaunch 1.16.0

Launch faster with forklaunch
use convert_case::{Case, Casing};
use ramhorns::Content;
use serde::{Deserialize, Serialize};

use super::{InitializableManifestConfig, InitializableManifestConfigMetadata};
use crate::{config_struct, constants::Database};

config_struct!(
    #[derive(Debug, Serialize, Content, Clone)]
    pub(crate) struct ApplicationManifestData {
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) database: String,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_postgres: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_sqlite: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_mysql: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_mariadb: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_better_sqlite: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_libsql: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_mssql: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_mongo: bool,
        #[serde(skip_serializing, skip_deserializing)]
        pub(crate) is_in_memory_database: bool,
    }
);

impl InitializableManifestConfig for ApplicationManifestData {
    fn initialize(&self, metadata: InitializableManifestConfigMetadata) -> Self {
        let metadata = match metadata {
            InitializableManifestConfigMetadata::Application(metadata) => metadata,
            _ => unreachable!(),
        };

        let initialized_application_manifest_data = Self {
            app_name: metadata.app_name.clone(),
            camel_case_app_name: metadata.app_name.clone().to_case(Case::Camel),
            pascal_case_app_name: metadata.app_name.clone().to_case(Case::Pascal),
            kebab_case_app_name: metadata.app_name.clone().to_case(Case::Kebab),
            ..self.clone()
        };

        if let Some(database) = metadata.database {
            let parsed_database = database.parse::<Database>().unwrap();
            return Self {
                database: parsed_database.to_string(),

                is_postgres: parsed_database == Database::PostgreSQL,
                is_sqlite: parsed_database == Database::SQLite,
                is_mysql: parsed_database == Database::MySQL,
                is_mariadb: parsed_database == Database::MariaDB,
                is_better_sqlite: parsed_database == Database::BetterSQLite,
                is_libsql: parsed_database == Database::LibSQL,
                is_mssql: parsed_database == Database::MsSQL,
                is_mongo: parsed_database == Database::MongoDB,
                is_in_memory_database: parsed_database == Database::SQLite
                    || parsed_database == Database::BetterSQLite
                    || parsed_database == Database::LibSQL,

                ..initialized_application_manifest_data
            };
        }

        initialized_application_manifest_data
    }
}