Skip to main content

shared/config/boot/
app_config.rs

1use super::environment::*;
2use super::server::ServerConfig;
3
4use super::auth::AuthDriver;
5use super::cache::{CacheConfig, CacheDriver};
6use super::database::{DatabaseConfig, DatabaseDriver};
7use crate::config::AuthStrategy;
8
9#[derive(Debug, serde::Deserialize)]
10pub struct AppConfig {
11    pub name: String,
12    pub config_dir: String,
13    pub config_path: String,
14    pub server: ServerConfig,
15    pub database: DatabaseConfig,
16    pub cache: CacheConfig,
17    pub auth: AuthStrategy,
18}
19
20impl AppConfig {
21    fn env() -> Environment {
22        std::env::var("ENV")
23            .unwrap_or_else(|_| Environment::Dev.as_str().into())
24            .try_into()
25            .expect("Failed to parse ENV")
26    }
27    fn db() -> DatabaseDriver {
28        std::env::var("DB")
29            .unwrap_or_else(|_| DatabaseDriver::SQLite.as_str().into())
30            .try_into()
31            .expect("Failed to parse DB")
32    }
33    fn cache() -> CacheDriver {
34        std::env::var("CACHE")
35            .unwrap_or_else(|_| CacheDriver::InMemory.as_str().into())
36            .try_into()
37            .expect("Failed to parse CACHE")
38    }
39    fn auth() -> AuthDriver {
40        std::env::var("AUTH")
41            .unwrap_or_else(|_| AuthDriver::Jwt.as_str().into())
42            .try_into()
43            .expect("Failed to parse AUTH")
44    }
45
46    pub fn load() -> Result<AppConfig, config::ConfigError> {
47        let environment: Environment = Self::env();
48        let environment_path = format!("{}.yaml", environment.as_str());
49
50        let environment_database: DatabaseDriver = Self::db();
51        let database_path = format!(
52            "database/{}/{}.yaml",
53            environment_database.as_str(),
54            environment.as_str(),
55        );
56
57        let environment_cache = Self::cache();
58        let cache_path = format!(
59            "cache/{}/{}.yaml",
60            environment_cache.as_str(),
61            environment.as_str(),
62        );
63
64        let auth_driver = Self::auth();
65        let auth_path = format!("auth/{}.yaml", auth_driver.as_str(),);
66
67        let value = match environment {
68            Environment::Dev => "../../app/configuration",
69            Environment::Prod => "/app/configuration",
70            Environment::Ci => "../../app/configuration",
71        };
72        let config_dir = std::path::PathBuf::from(value);
73
74        let settings = config::Config::builder()
75            .add_source(config::File::from(config_dir.join("base.yaml")).required(true))
76            .add_source(config::File::from(config_dir.join(environment_path)))
77            .add_source(config::File::from(config_dir.join(database_path)))
78            .add_source(config::File::from(config_dir.join(cache_path)))
79            .add_source(config::File::from(config_dir.join(auth_path)))
80            .build()?;
81
82        settings.try_deserialize::<AppConfig>()
83    }
84}