standard_error/
loader.rs

1use crate::{conf::default_error_messages, settings, StandardError, StandardErrorMessages};
2use serde_json::to_string_pretty;
3use serde_yaml::Value;
4use std::{collections::HashMap, fs::File, io::BufReader};
5
6impl StandardError {
7    pub fn load_error_messages() -> Result<StandardErrorMessages, Box<dyn std::error::Error>> {
8        let file = File::open(&settings.error_yaml_file_path)?;
9        let reader = BufReader::new(file);
10        let yaml: Value = serde_yaml::from_reader(reader)?;
11        let mut messages: StandardErrorMessages = default_error_messages();
12        if let Some(errors) = yaml.get("errors").and_then(|v| v.as_sequence()) {
13            for error in errors {
14                if let Some(code) = error.get("code").and_then(|v| v.as_str()) {
15                    let mut locale_messages = HashMap::new();
16
17                    for (key, value) in error.as_mapping().unwrap() {
18                        if let Some(key_str) = key.as_str() {
19                            if key_str.starts_with("detail_") {
20                                if let Some(detail) = value.as_str() {
21                                    locale_messages.insert(
22                                        key_str.replace("detail_", "").to_string(),
23                                        detail.to_string(),
24                                    );
25                                }
26                            }
27                        }
28                    }
29                    messages.insert(code.to_string(), locale_messages);
30                }
31            }
32        }
33        log::debug!("Loaded error messages: {}", to_string_pretty(&messages)?);
34        Ok(messages)
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    #[tokio::test]
43    async fn test_error_csv_loader() {
44        env_logger::init();
45        StandardError::load_error_messages().unwrap();
46    }
47}