webserver_base/base_settings/
base_settings.rs

1use std::env;
2
3use super::Environment;
4
5#[derive(Clone)]
6pub struct BaseSettings {
7    pub host: String,
8    pub port: u16,
9    pub environment: Environment,
10
11    pub project_name: String,
12    pub project_description: String,
13    pub project_keywords: String,
14    pub home_url: String,
15
16    pub analytics_domain: String,
17    pub sentry_dsn: String,
18}
19
20impl Default for BaseSettings {
21    /// # Panics
22    ///
23    /// Will panic if env var `PORT` is not a u16.
24    fn default() -> Self {
25        // env
26        let environment = env::var("ENVIRONMENT").map_or(Environment::Development, |s| {
27            Environment::try_from(s.clone()).unwrap_or_else(|_| {
28                panic!("failed to parse `ENVIRONMENT` environment variable: {s}")
29            })
30        });
31
32        // host:port
33        let host = env::var("HOST").unwrap_or_else(|_| {
34            if environment == Environment::Development {
35                "127.0.0.1".to_string()
36            } else {
37                "0.0.0.0".to_string()
38            }
39        });
40        let port = env::var("PORT").map_or(8080, |s| {
41            s.parse::<u16>()
42                .expect("failed to parse `PORT` environment variable")
43        });
44
45        // project details
46        let Ok(project_name) = env::var("PROJECT_NAME") else {
47            panic!("environment variable `PROJECT_NAME` is not set");
48        };
49        let Ok(project_description) = env::var("PROJECT_DESCRIPTION") else {
50            panic!("environment variable `PROJECT_DESCRIPTION` is not set");
51        };
52        let Ok(project_keywords) = env::var("PROJECT_KEYWORDS") else {
53            panic!("environment variable `PROJECT_KEYWORDS` is not set");
54        };
55        let Ok(home_url) = env::var("HOME_URL") else {
56            panic!("environment variable `HOME_URL` is not set");
57        };
58
59        // analytics domain
60        let Ok(analytics_domain) = env::var("ANALYTICS_DOMAIN") else {
61            panic!("environment variable `ANALYTICS_DOMAIN` is not set");
62        };
63
64        // sentry DSN
65        let Ok(sentry_dsn) = env::var("SENTRY_DSN") else {
66            panic!("environment variable `SENTRY_DSN` is not set");
67        };
68
69        // all settings
70        Self {
71            host,
72            port,
73            environment,
74
75            project_name,
76            project_description,
77            project_keywords,
78            home_url,
79
80            analytics_domain,
81            sentry_dsn,
82        }
83    }
84}