grafana_dashboard/
lib.rs

1//! Serializable structures for grafana dashboard import/export
2//!
3//! # Known bugs / limitations
4//! - Missing fields
5//! - Too many optional fields
6//! - No data validation
7//! - No test or coverage
8//!
9//! Feel free to submit PR's to fix.
10
11use serde::{Deserialize, Serialize};
12pub mod annotation;
13pub mod link;
14pub mod panel;
15pub mod templating;
16
17use annotation::Annotations;
18use link::Link;
19use panel::Panel;
20use templating::Templating;
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct Dashboard {
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub annotations: Option<Annotations>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub description: Option<String>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub editable: Option<bool>,
30    #[serde(rename = "gnetId")]
31    pub gnet_id: Option<u32>,
32    #[serde(rename = "graphTooltip")]
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub graph_tooltip: Option<u32>,
35    #[serde(rename = "hideControls")]
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub hide_controls: Option<bool>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub id: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub links: Option<Vec<Link>>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub panels: Option<Vec<Panel>>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub refresh: Option<String>,
46    #[serde(rename = "schemaVersion")]
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub schema_version: Option<u32>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub style: Option<String>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub tags: Option<Vec<String>>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub templating: Option<Templating>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub time: Option<Time>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub timepicker: Option<TimePicker>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub timezone: Option<String>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub title: Option<String>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub uid: Option<String>,
65    pub variables: Variables,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub version: Option<u32>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct Variables {
72    pub list: Vec<Variable>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct Variable {
77    // TODO fields
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct Time {
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub from: Option<String>,
84    pub to: Option<String>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct TimePicker {
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub collapse: Option<bool>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub enable: Option<bool>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub notice: Option<bool>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub now: Option<bool>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub refresh_intervals: Option<Vec<String>>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub status: Option<String>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub r#type: Option<String>,
103}
104
105#[cfg(test)]
106mod utils;
107
108#[cfg(test)]
109mod tests {
110    use super::*;
111    use crate::utils::collapse;
112    use pretty_assertions::assert_eq;
113    use serde_json;
114    // use utils;
115
116    #[test]
117    pub fn test_x() {
118        let json = collapse(r##""##);
119        let structure: Panel = serde_json::from_str(json.as_str()).expect("failed to stringify");
120        assert_eq!(
121            json,
122            serde_json::to_string(&structure).expect("failed to stringify structure")
123        );
124    }
125}