Skip to main content

rust_web_server/entry_point/
mod.rs

1#[cfg(test)]
2mod tests;
3pub mod command_line_args;
4pub mod config_file;
5pub mod environment_variables;
6
7
8use std::{env};
9
10use crate::entry_point::command_line_args::{override_environment_variables_from_command_line_args};
11use crate::entry_point::config_file::override_environment_variables_from_config;
12use crate::entry_point::environment_variables::read_system_environment_variables;
13
14#[derive(PartialEq, Eq, Clone, Debug)]
15pub struct Config {}
16
17impl Config {
18    pub const RWS_CONFIG_IP: &'static str = "RWS_CONFIG_IP";
19    pub const RWS_CONFIG_IP_DEFAULT_VALUE: &'static str = "127.0.0.1";
20
21    pub const RWS_CONFIG_PORT: &'static str = "RWS_CONFIG_PORT";
22    pub const RWS_CONFIG_PORT_DEFAULT_VALUE: &'static str = "7878";
23
24    pub const RWS_CONFIG_THREAD_COUNT: &'static str = "RWS_CONFIG_THREAD_COUNT";
25    pub const RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE: &'static str = "200";
26
27    pub const RWS_CONFIG_CORS_ALLOW_ALL: &'static str = "RWS_CONFIG_CORS_ALLOW_ALL";
28    pub const RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE: &'static str = "true";
29
30    pub const RWS_CONFIG_CORS_ALLOW_ORIGINS: &'static str = "RWS_CONFIG_CORS_ALLOW_ORIGINS";
31    pub const RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE: &'static str = "";
32
33    pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS: &'static str = "RWS_CONFIG_CORS_ALLOW_CREDENTIALS";
34    pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE: &'static str = "";
35
36    pub const RWS_CONFIG_CORS_ALLOW_HEADERS: &'static str = "RWS_CONFIG_CORS_ALLOW_HEADERS";
37    pub const RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE: &'static str = "";
38
39    pub const RWS_CONFIG_CORS_ALLOW_METHODS: &'static str = "RWS_CONFIG_CORS_ALLOW_METHODS";
40    pub const RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE: &'static str = "";
41
42    pub const RWS_CONFIG_CORS_EXPOSE_HEADERS: &'static str = "RWS_CONFIG_CORS_EXPOSE_HEADERS";
43    pub const RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE: &'static str = "";
44
45    pub const RWS_CONFIG_CORS_MAX_AGE: &'static str = "RWS_CONFIG_CORS_MAX_AGE";
46    pub const RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE: &'static str = "86400";
47
48    pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static str = "RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES";
49    pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE: &'static str = "10000";
50
51    pub const RWS_CONFIG_TLS_CERT_FILE: &'static str = "RWS_CONFIG_TLS_CERT_FILE";
52    pub const RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE: &'static str = "";
53
54    pub const RWS_CONFIG_TLS_KEY_FILE: &'static str = "RWS_CONFIG_TLS_KEY_FILE";
55    pub const RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE: &'static str = "";
56
57
58    pub const RWS_DEFAULT_IP: &'static str = "127.0.0.1";
59    pub const RWS_DEFAULT_PORT: &'static i32 = &7878;
60    pub const RWS_DEFAULT_THREAD_COUNT: &'static i32 = &200;
61    pub const RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static i64 = &10000;
62
63
64}
65
66pub fn bootstrap() {
67    read_system_environment_variables();
68    override_environment_variables_from_config(None);
69    override_environment_variables_from_command_line_args();
70}
71
72pub fn set_default_values() {
73    println!("  Initializing default values");
74
75    let is_var_set = env::var(Config::RWS_CONFIG_IP).is_ok();
76    if !is_var_set {
77        env::set_var(Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
78        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
79    } else {
80        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_IP);
81    }
82
83
84    let is_var_set = env::var(Config::RWS_CONFIG_PORT).is_ok();
85    if !is_var_set {
86        env::set_var(Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
87        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
88    } else {
89        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_PORT);
90    }
91
92    let is_var_set = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES).is_ok();
93    if !is_var_set {
94        env::set_var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
95        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
96    } else {
97        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
98    }
99
100
101    let is_var_set = env::var(Config::RWS_CONFIG_THREAD_COUNT).is_ok();
102    if !is_var_set {
103        env::set_var(Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
104        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
105    } else {
106        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_THREAD_COUNT);
107    }
108
109    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ALL).is_ok();
110    if !is_var_set {
111        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
112        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
113    } else {
114        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ALL);
115    }
116
117
118    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS).is_ok();
119    if !is_var_set {
120        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
121        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
122    } else {
123        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS);
124    }
125
126    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS).is_ok();
127    if !is_var_set {
128        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
129        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
130    } else {
131        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS);
132    }
133
134    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS).is_ok();
135    if !is_var_set {
136        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
137        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
138    } else {
139        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_HEADERS);
140    }
141
142
143    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_METHODS).is_ok();
144    if !is_var_set {
145        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
146        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
147    } else {
148        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_METHODS);
149    }
150
151    let is_var_set = env::var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS).is_ok();
152    if !is_var_set {
153        env::set_var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
154        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
155    } else {
156        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS);
157    }
158
159    let is_var_set = env::var(Config::RWS_CONFIG_CORS_MAX_AGE).is_ok();
160    if !is_var_set {
161        env::set_var(Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
162        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
163    } else {
164        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_MAX_AGE);
165    }
166
167
168    let is_var_set = env::var(Config::RWS_CONFIG_TLS_CERT_FILE).is_ok();
169    if !is_var_set {
170        env::set_var(Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
171        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
172    } else {
173        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_TLS_CERT_FILE);
174    }
175
176    let is_var_set = env::var(Config::RWS_CONFIG_TLS_KEY_FILE).is_ok();
177    if !is_var_set {
178        env::set_var(Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
179        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
180    } else {
181        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_TLS_KEY_FILE);
182    }
183
184    println!("  End of initializing default values\n");
185}
186
187
188pub fn get_ip_port_thread_count() -> (String, i32, i32) {
189    let mut ip : String = Config::RWS_CONFIG_IP_DEFAULT_VALUE.to_string();
190    let mut port: i32 = *Config::RWS_DEFAULT_PORT;
191    let mut thread_count: i32 = *Config::RWS_DEFAULT_THREAD_COUNT;
192
193    let boxed_ip = env::var(Config::RWS_CONFIG_IP);
194    if boxed_ip.is_ok() {
195        ip = boxed_ip.unwrap()
196    }
197
198    let boxed_port = env::var(Config::RWS_CONFIG_PORT);
199    if boxed_port.is_ok() {
200        let _port = boxed_port.unwrap();
201        let boxed_parse = _port.parse::<i32>();
202        if boxed_parse.is_ok() {
203            port = boxed_parse.unwrap();
204        } else {
205            eprintln!("unable to parse port value, expected number, got {}, variable: {}",
206                      _port, Config::RWS_CONFIG_PORT);
207        }
208    } else {
209        eprintln!("unable to parse port value, variable: {}", Config::RWS_CONFIG_PORT);
210    }
211
212    let boxed_thread_count = env::var(Config::RWS_CONFIG_THREAD_COUNT);
213    if boxed_thread_count.is_ok() {
214        let _thread_count = boxed_thread_count.unwrap();
215        let boxed_parse = _thread_count.parse();
216        if boxed_parse.is_ok() {
217            thread_count = boxed_parse.unwrap()
218        } else {
219            eprintln!("unable to parse thread count value, expected number, got {}, variable: {}",
220                      thread_count, Config::RWS_CONFIG_THREAD_COUNT);
221        }
222
223    } else {
224        eprintln!("unable to parse thread count value, variable: {}", Config::RWS_CONFIG_THREAD_COUNT);
225    }
226
227    (ip, port, thread_count)
228}
229
230pub fn get_request_allocation_size() -> i64 {
231    let mut request_allocation_size: i64 = *Config::RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES;
232
233    let boxed_port = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
234    if boxed_port.is_ok() {
235        let _request_allocation_size = boxed_port.unwrap();
236        let boxed_parse = _request_allocation_size.parse::<i64>();
237        if boxed_parse.is_ok() {
238            request_allocation_size = boxed_parse.unwrap();
239        } else {
240            eprintln!("unable to parse port value, expected number, got {}, variable: {}",
241                      _request_allocation_size, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
242        }
243    } else {
244        eprintln!("unable to parse request allocation size value, variable: {}", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
245    }
246
247
248    request_allocation_size
249}
250