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