shared/config/boot/
app_config.rs1use 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 };
71 let config_dir = std::path::PathBuf::from(value);
72
73 let settings = config::Config::builder()
74 .add_source(config::File::from(config_dir.join("base.yaml")).required(true))
75 .add_source(config::File::from(config_dir.join(environment_path)))
76 .add_source(config::File::from(config_dir.join(database_path)))
77 .add_source(config::File::from(config_dir.join(cache_path)))
78 .add_source(config::File::from(config_dir.join(auth_path)))
79 .build()?;
80
81 settings.try_deserialize::<AppConfig>()
82 }
83}