log_analyzer/models/
settings.rs

1use anyhow::{anyhow, Result};
2use serde::{Deserialize, Serialize};
3
4use super::{filter::Filter, format::Format};
5
6#[derive(Serialize, Deserialize, Debug)]
7pub struct Settings {
8    pub formats: Option<Vec<Format>>,
9    pub filters: Option<Vec<Filter>>,
10    pub primary_color: Option<(u8, u8, u8)>,
11}
12
13impl Settings {
14    pub fn from_json(json: &str) -> Result<Self> {
15        let settings: Result<Settings, _> = serde_json::from_str(json);
16
17        match settings {
18            Ok(settings) => Ok(settings),
19            _ => Err(anyhow!("Unable to decode settings from file")),
20        }
21    }
22}
23
24#[cfg(test)]
25mod tests {
26    use crate::models::log_line::LogLine;
27
28    use super::*;
29
30    #[test]
31    fn test_load_settings() {
32        let json = r#"{
33            "primary_color": [200, 200, 0],
34            "formats": [
35                {
36                    "alias": "Default",
37                    "regex": "(?P<PAYLOAD>.*)"
38                }
39            ],
40            "filters": [
41                {
42                    "alias": "Name",
43                    "action": "INCLUDE",
44                    "filter": {
45                        "payload": ".*"
46                    }
47                }
48            ]
49        }"#;
50
51        let settings: Result<Settings, serde_json::Error> = serde_json::from_str(json);
52        assert!(settings.is_ok())
53    }
54
55    #[test]
56    fn test_load_empty_settings() {
57        let json = r#"{}"#;
58
59        let settings: Result<Settings, serde_json::Error> = serde_json::from_str(json);
60        assert!(settings.is_ok())
61    }
62
63    #[test]
64    fn test_serialize_settings() {
65        let settings = Settings {
66            formats: None,
67            filters: Some(vec![Filter {
68                alias: "test".into(),
69                action: crate::models::filter::FilterAction::INCLUDE,
70                filter: LogLine {
71                    payload: "test".into(),
72                    color: Some((200, 200, 0)),
73                    ..Default::default()
74                },
75            }]),
76            primary_color: None,
77        };
78        let json = serde_json::to_string(&settings);
79        assert!(json.is_ok());
80    }
81}