headless_lms_server/config/
open_university_config.rs1use crate::config::program_config::ProgramConfig;
2
3pub const OPEN_UNIVERSITY_COURSE_URL: &str = "OPEN_UNIVERSITY_COURSE_URL";
4pub const OPEN_UNIVERSITY_TOKEN: &str = "OPEN_UNIVERSITY_TOKEN";
5
6pub struct OpenUniversityConfig {
7 pub database_url: String,
8 pub course_url: Option<String>,
9 pub token: Option<String>,
10 pub rust_log: Option<String>,
11}
12
13impl OpenUniversityConfig {
14 pub fn try_from_env() -> Self {
16 Self {
17 database_url: ProgramConfig::database_url_with_default(),
18 course_url: optional_non_blank(OPEN_UNIVERSITY_COURSE_URL),
19 token: optional_non_blank(OPEN_UNIVERSITY_TOKEN),
20 rust_log: ProgramConfig::optional("RUST_LOG"),
21 }
22 }
23}
24
25fn optional_non_blank(key: &str) -> Option<String> {
26 ProgramConfig::optional(key).and_then(non_blank_string)
27}
28
29fn non_blank_string(value: String) -> Option<String> {
30 let trimmed = value.trim();
31 if trimmed.is_empty() {
32 None
33 } else {
34 Some(trimmed.to_string())
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::non_blank_string;
41
42 #[test]
43 fn non_blank_string_treats_blank_values_as_missing() {
44 assert_eq!(non_blank_string(" ".to_string()), None);
45 assert_eq!(
46 non_blank_string(" https://example.com ".to_string()),
47 Some("https://example.com".to_string())
48 );
49 }
50}