use crate::AppError;
use serde::Deserialize;
use std::sync::OnceLock;
static CONFIG: OnceLock<Config> = OnceLock::new();
#[derive(Debug, Clone, Deserialize)]
pub struct Config {
#[serde(default = "default_app_name")]
pub app_name: String,
#[serde(default = "default_app_env")]
pub app_env: String,
#[serde(default = "default_app_port")]
pub app_port: u16,
#[serde(default = "default_session_secure_cookie")]
pub session_secure_cookie: bool,
#[serde(default = "default_app_debug")]
pub app_debug: bool,
#[serde(default = "default_app_url")]
pub app_url: String,
#[serde(default = "default_app_locale")]
pub app_locale: String,
#[serde(default = "default_app_fallback_locale")]
pub app_fallback_locale: String,
#[serde(default = "default_api_prefix")]
pub api_prefix: String,
#[serde(default = "default_mail_driver")]
pub mail_driver: String,
#[serde(default = "default_mail_host")]
pub mail_host: String,
#[serde(default = "default_mail_port")]
pub mail_port: u16,
#[serde(default = "default_mail_username")]
pub mail_username: String,
#[serde(default = "default_mail_password")]
pub mail_password: String,
#[serde(default = "default_mail_encryption")]
pub mail_encryption: String,
#[serde(default = "default_mail_from_address")]
pub mail_from_address: String,
#[serde(default)]
pub mail_from_name: String,
#[serde(default = "default_cache_driver")]
pub cache_driver: String,
#[serde(default = "default_queue_driver")]
pub queue_driver: String,
#[serde(default = "default_log_channel")]
pub log_channel: String,
#[serde(default)]
pub log_level: String,
#[serde(default = "default_log_max_size")]
pub log_max_size: u64,
#[serde(default = "default_log_keep_files")]
pub log_keep_files: u32,
#[serde(default = "default_deploy_type")]
pub deploy_type: String,
#[serde(default = "default_session_driver")]
pub session_driver: String,
}
fn default_session_driver() -> String {
"database".to_string()
}
fn default_app_name() -> String {
"Larust".to_string()
}
fn default_app_env() -> String {
"local".to_string()
}
fn default_app_port() -> u16 {
34187
}
fn default_session_secure_cookie() -> bool {
true
}
fn default_app_debug() -> bool {
false
}
fn default_app_url() -> String {
"http://localhost".to_string()
}
fn default_app_locale() -> String {
"en".to_string()
}
fn default_app_fallback_locale() -> String {
"en".to_string()
}
fn default_api_prefix() -> String {
"/api".to_string()
}
fn default_mail_driver() -> String {
"log".to_string()
}
fn default_mail_host() -> String {
"127.0.0.1".to_string()
}
fn default_mail_port() -> u16 {
587
}
fn default_mail_username() -> String {
String::new()
}
fn default_mail_password() -> String {
String::new()
}
fn default_mail_encryption() -> String {
"tls".to_string()
}
fn default_mail_from_address() -> String {
"hello@example.com".to_string()
}
fn default_cache_driver() -> String {
"database".to_string()
}
fn default_queue_driver() -> String {
"database".to_string()
}
fn default_deploy_type() -> String {
"web".to_string()
}
fn default_log_channel() -> String {
"stdout".to_string()
}
fn default_log_max_size() -> u64 {
10 * 1024 * 1024
}
fn default_log_keep_files() -> u32 {
5
}
impl Config {
pub fn from_value(value: &serde_json::Value) -> Result<Self, AppError> {
serde_json::from_value(value.clone()).map_err(|source| AppError::Config(Box::new(source)))
}
pub(crate) fn publish(self) {
if CONFIG.set(self).is_err() {
tracing::warn!(
"Application::new() called more than once in this process; \
config(), url(), and asset() still use the first call's values"
);
}
}
}
pub fn config() -> &'static Config {
CONFIG
.get()
.expect("larust_core::config() called before Application::new()")
}
pub fn try_config() -> Option<&'static Config> {
CONFIG.get()
}