req/src/lib.rs

189 lines
6.6 KiB
Rust
Raw Normal View History

2024-05-08 09:52:34 +00:00
use indexmap::{indexmap, IndexMap};
use serde::{Deserialize, Serialize, Serializer};
use stringlit::s;
pub fn my_trim<S>(v: &String, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
s.serialize_str(v.trim())
}
2024-05-08 12:18:03 +00:00
#[derive(Debug, Deserialize, Serialize)]
2024-05-08 09:52:34 +00:00
pub struct Requirement {
pub name: String,
#[serde(serialize_with = "my_trim")]
pub description: String,
2024-05-08 12:18:03 +00:00
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub requires: Vec<String>,
2024-05-08 09:52:34 +00:00
}
2024-05-08 12:18:03 +00:00
#[derive(Debug, Deserialize, Serialize)]
2024-05-08 09:52:34 +00:00
pub struct Topic {
pub name: String,
#[serde(default, skip_serializing_if = "IndexMap::is_empty")]
pub requirements: IndexMap<String, Requirement>,
#[serde(default, skip_serializing_if = "IndexMap::is_empty")]
pub subtopics: IndexMap<String, Topic>,
}
2024-05-08 12:18:03 +00:00
#[derive(Debug, Deserialize, Serialize)]
2024-05-08 09:52:34 +00:00
pub struct Definition {
pub name: String,
pub value: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub additional_info: Vec<String>,
}
2024-05-08 12:18:03 +00:00
#[derive(Debug, Deserialize, Serialize)]
2024-05-08 09:52:34 +00:00
pub struct ConfigDefault {
pub name: String,
#[serde(rename = "type")]
pub typ: String,
2024-05-08 12:18:03 +00:00
#[serde(default, skip_serializing_if = "Option::is_none")]
pub valid_values: Option<Vec<String>>,
2024-05-08 09:52:34 +00:00
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_value: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hint: Option<String>,
}
2024-05-08 12:18:03 +00:00
#[derive(Debug, Deserialize, Serialize)]
2024-05-08 09:52:34 +00:00
pub struct Project {
pub name: String,
#[serde(serialize_with = "my_trim")]
pub description: String,
#[serde(default, skip_serializing_if = "IndexMap::is_empty")]
pub topics: IndexMap<String, Topic>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub definitions: Vec<Definition>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub config_defaults: Vec<ConfigDefault>,
}
pub fn demo_project() -> Project {
Project {
name: s!("journal-uploader"),
description: s!(r#"
The journal-uploader has two main functionalities.
- Take a stream of log messages and filter them depending on their severity
- Upload journal logs for a specified time when activated through cloud call"#),
topics: indexmap! {
s!("FEAT-1") => Topic {
name: s!("Traced Logging"),
subtopics: indexmap! {
s!("SUB-1") => Topic {
name: s!("File Monitoring"),
requirements: indexmap! {
s!("REQ-1") => Requirement {
name: s!("Continuous Monitoring"),
description: s!(r#"The tool must continuously monitor a designated directory."#),
2024-05-08 12:18:03 +00:00
requires: vec! [],
}
},
subtopics: indexmap! {}
},
s!("SUB-2") => Topic {
name: s!("File Detection"),
requirements: indexmap! {
s!("REQ-1") => Requirement {
name: s!("Detection of New Files"),
description: s!(r#"The tool must detect the addition of new files in the monitored directory."#),
requires: vec! [],
},
s!("REQ-2") => Requirement {
name: s!("Avoid Re-processing"),
description: s!(r#"The tool must not process files that have already been processed."#),
requires: vec! [],
2024-05-08 09:52:34 +00:00
}
},
subtopics: indexmap! {}
},
},
requirements: indexmap! {},
}
},
definitions: vec![
Definition {
name: s!("Default Journal Directory"),
value: s!("/run/log/journal/<machine_id>"),
additional_info: vec![s!("Machine ID can be found at /etc/machine-id")],
},
Definition {
name: s!("Default Output Directory"),
value: s!("/run/log/filtered-journal"),
additional_info: vec![],
},
],
config_defaults: vec![
ConfigDefault {
name: s!("Journal Directory"),
typ: s!("Path"),
unit: None,
2024-05-08 12:18:03 +00:00
valid_values: None,
2024-05-08 09:52:34 +00:00
default_value: None,
hint: None,
},
ConfigDefault {
name: s!("Output Directory"),
typ: s!("Path"),
unit: None,
2024-05-08 12:18:03 +00:00
valid_values: None,
2024-05-08 09:52:34 +00:00
default_value: None,
hint: None,
},
ConfigDefault {
name: s!("Trigger Priority"),
typ: s!("Enum"),
unit: None,
2024-05-08 12:18:03 +00:00
valid_values: Some(vec![
2024-05-08 09:52:34 +00:00
s!("Emergency"),
s!("Alert"),
s!("Critical"),
s!("Error"),
s!("Warning"),
s!("Notice"),
s!("Info"),
s!("Debug"),
2024-05-08 12:18:03 +00:00
]),
2024-05-08 09:52:34 +00:00
default_value: Some(s!("Warning")),
hint: None,
},
ConfigDefault {
name: s!("Journal Context"),
typ: s!("Integer"),
unit: Some(s!("Seconds")),
2024-05-08 12:18:03 +00:00
valid_values: None,
2024-05-08 09:52:34 +00:00
default_value: Some(s!("15")),
hint: None,
},
ConfigDefault {
name: s!("Max File Size"),
typ: s!("Integer"),
unit: Some(s!("Bytes")),
2024-05-08 12:18:03 +00:00
valid_values: None,
2024-05-08 09:52:34 +00:00
default_value: Some(s!("8388608")),
hint: Some(s!("(8 MB)")),
},
ConfigDefault {
name: s!("Max Directory Size"),
typ: s!("Integer"),
unit: Some(s!("Bytes")),
2024-05-08 12:18:03 +00:00
valid_values: None,
2024-05-08 09:52:34 +00:00
default_value: Some(s!("75497472")),
hint: Some(s!("(72 MB)")),
},
ConfigDefault {
name: s!("File Monitoring Interval"),
typ: s!("Integer"),
unit: Some(s!("Seconds")),
2024-05-08 12:18:03 +00:00
valid_values: None,
2024-05-08 09:52:34 +00:00
default_value: Some(s!("10")),
hint: None,
},
],
}
}