/// Environment configuration for the application. /// /// Loads required configuration from environment variables at startup. /// All variables must be present or the application will panic during [`Env::load`]. /// Used by [`AppState`](crate::AppState) for configuring JWT signing and CORS. /// /// # Fields /// - `db_url`: PostgreSQL database connection URL /// - `token_secret`: Secret key used to sign and verify [`Claims`](crate::models::Claims) in JWT tokens /// - `origin`: Frontend origin URL for CORS policy configuration /// /// # Required Environment Variables /// - `DATABASE_URL`: PostgreSQL connection string (e.g., `postgresql://user:pass@localhost/dbname`) /// - `TOKEN_SECRET`: Secret key for JWT token signing (use a strong random string in production) /// - `ORIGIN`: Frontend URL for CORS (e.g., `http://localhost:8080`) #[derive(Debug, Clone)] pub struct Env { /// PostgreSQL database connection URL pub db_url: String, /// Secret key used to sign and verify JWT tokens pub token_secret: String, /// Frontend origin URL for CORS policy pub origin: String, /// Backend port number pub backend_port: String, } impl Env { /// Loads environment configuration from system environment variables. /// /// Reads `DATABASE_URL`, `TOKEN_SECRET`, and `ORIGIN` from the environment and returns /// a configured [`Env`] instance. Used during server initialization in the `main` function. /// /// # Panics /// If any required variable is missing (DATABASE_URL, TOKEN_SECRET, or ORIGIN). /// /// # Example /// ```ignore /// let env = Env::load(); /// // Environment must have DATABASE_URL, TOKEN_SECRET, and ORIGIN set /// let app_state = AppState { /// db: pool, /// env, /// }; /// ``` pub fn load() -> Env { let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let token_secret = std::env::var("TOKEN_SECRET").expect("TOKEN_SECRET must be set"); let origin = std::env::var("ORIGIN").expect("ORIGIN must be set"); let backend_port = std::env::var("BACKEND_PORT").expect("BACKEND_PORT must be set"); Env { db_url, token_secret, origin, backend_port, } } }