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}