log_analyzer/models/
settings.rs1use 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}