Skip to main content

rustbasic_core/
app.rs

1/* ---------------------------------------------------------
2 * šŸ“‘ LABEL: APP CONFIG (config/app.rs)
3 * Definisi struct Config dan pengisian datanya dari .env
4 * --------------------------------------------------------- */
5
6use std::env;
7
8#[derive(Debug, Clone)]
9pub struct Config {
10    pub app_name: String,
11    pub app_port: u16,
12    pub app_host: String,
13    pub app_key: String,
14    pub app_debug: bool,
15    pub app_url: String,
16    pub app_timezone: String,
17    pub app_limit_request: u64,
18    pub vite_port: u16,
19    pub websocket_enabled: bool,
20    
21    // šŸ—„ļø Database
22    pub db_connection: String,
23    pub db_host: String,
24    pub db_port: u16,
25    pub db_database: String,
26    pub db_username: String,
27    pub db_password: String,
28    
29    // šŸ”‘ Session
30    pub session_driver: String,
31    
32    // šŸ“§ Mail
33    pub mail_host: String,
34    pub mail_port: u16,
35    pub mail_username: String,
36    pub mail_password: String,
37    pub mail_from_address: String,
38    pub mail_from_name: String,
39}
40
41impl Config {
42    pub fn load() -> Self {
43        Self {
44            app_name: env::var("APP_NAME").unwrap_or_else(|_| "RustBasic".to_string()),
45            app_port: env::var("APP_PORT")
46                .unwrap_or_else(|_| "4000".to_string())
47                .parse()
48                .expect("APP_PORT harus berupa angka"),
49            app_host: env::var("APP_HOST").unwrap_or_else(|_| "0.0.0.0".to_string()),
50            app_key: {
51                let key = env::var("APP_KEY").unwrap_or_default();
52                if key.is_empty() {
53                    eprintln!("\nāŒ Error: APP_KEY belum dikonfigurasi di file .env!");
54                    eprintln!("šŸ’” Silakan jalankan perintah berikut untuk membuat key baru:");
55                    eprintln!("   cargo rustbasic key:generate\n");
56                    std::process::exit(1);
57                }
58                key
59            },
60            app_debug: env::var("APP_DEBUG").unwrap_or_else(|_| "false".to_string()).parse().unwrap_or(false),
61            app_url: {
62                let mut url = env::var("APP_URL").unwrap_or_else(|_| "http://localhost:4000".to_string());
63                let port = env::var("APP_PORT").unwrap_or_else(|_| "4000".to_string());
64                if url.starts_with("http://localhost:") || url == "http://localhost" {
65                    url = format!("http://localhost:{}", port);
66                } else if url.starts_with("http://127.0.0.1:") || url == "http://127.0.0.1" {
67                    url = format!("http://127.0.0.1:{}", port);
68                }
69                url
70            },
71            app_timezone: env::var("APP_TIMEZONE").unwrap_or_else(|_| "UTC".to_string()),
72            app_limit_request: env::var("APP_LIMIT_REQUEST")
73                .unwrap_or_else(|_| "20".to_string())
74                .parse()
75                .expect("APP_LIMIT_REQUEST harus berupa angka"),
76            vite_port: env::var("VITE_PORT")
77                .unwrap_or_else(|_| "5173".to_string())
78                .parse()
79                .expect("VITE_PORT harus berupa angka"),
80            websocket_enabled: env::var("WEBSOCKET_ENABLED")
81                .unwrap_or_else(|_| "false".to_string())
82                .parse()
83                .unwrap_or(false),
84            
85            // Database
86            db_connection: env::var("DB_CONNECTION").unwrap_or_else(|_| "sqlite".to_string()),
87            db_host: env::var("DB_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()),
88            db_port: env::var("DB_PORT")
89                .unwrap_or_else(|_| "3306".to_string())
90                .parse()
91                .expect("DB_PORT harus berupa angka"),
92            db_database: env::var("DB_DATABASE").unwrap_or_else(|_| "rustbasic".to_string()),
93            db_username: env::var("DB_USERNAME").unwrap_or_else(|_| "root".to_string()),
94            db_password: env::var("DB_PASSWORD").unwrap_or_default(),
95            
96            // Session
97            session_driver: env::var("SESSION_DRIVER").unwrap_or_else(|_| "database".to_string()),
98            
99            // Mail
100            mail_host: env::var("MAIL_HOST").unwrap_or_else(|_| "smtp.mailtrap.io".to_string()),
101            mail_port: env::var("MAIL_PORT")
102                .unwrap_or_else(|_| "2525".to_string())
103                .parse()
104                .expect("MAIL_PORT harus berupa angka"),
105            mail_username: env::var("MAIL_USERNAME").unwrap_or_else(|_| "null".to_string()),
106            mail_password: env::var("MAIL_PASSWORD").unwrap_or_else(|_| "null".to_string()),
107            mail_from_address: env::var("MAIL_FROM_ADDRESS").unwrap_or_else(|_| "hello@example.com".to_string()),
108            mail_from_name: env::var("MAIL_FROM_NAME").unwrap_or_else(|_| "RustBasic".to_string()),
109        }
110    }
111
112}