Skip to main content

headless_lms_server/config/
open_university_config.rs

1use 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    /// Loads Open University job configuration from environment variables.
15    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}