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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use crate::database::DbContext;
use crate::datadog::DatadogAPI;
use alfred::Item;
use failure::Error;
use std::str;
pub struct DatadogWorkflow<'a> {
api_key: &'a str,
application_key: &'a str,
db: DbContext,
}
impl<'a> DatadogWorkflow<'a> {
#[inline]
pub fn new(
api_key: &'a str,
application_key: &'a str,
database_url: &str,
) -> Result<Self, Error> {
let db = DbContext::new(database_url)?;
Ok(DatadogWorkflow {
api_key,
application_key,
db,
})
}
pub fn refresh_cache(&mut self) -> Result<(), Error> {
let datadog_api = DatadogAPI::new(self.api_key, self.application_key);
self.db.run_migrations()?;
self.refresh_timeboards(&datadog_api)?;
self.refresh_screenboards(&datadog_api)?;
self.refresh_monitors(&datadog_api)?;
self.db.optimize()
}
fn refresh_timeboards(&mut self, datadog_api: &DatadogAPI) -> Result<(), Error> {
let mut db = self.db.timeboards();
db.delete_all()?;
let results = datadog_api.get_timeboards()?;
db.insert(&results)?;
Ok(())
}
fn refresh_screenboards(&mut self, datadog_api: &DatadogAPI) -> Result<(), Error> {
let mut db = self.db.screenboards();
db.delete_all()?;
let results = datadog_api.get_screenboards()?;
db.insert(&results)?;
Ok(())
}
fn refresh_monitors(&mut self, datadog_api: &DatadogAPI) -> Result<(), Error> {
let mut db = self.db.monitors();
db.delete_all()?;
let results = datadog_api.get_monitors()?;
db.insert(&results)?;
Ok(())
}
pub fn query_timeboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
let results = self.db.timeboards().find(title, 10)?;
let items = results
.into_iter()
.map(|m| {
alfred::ItemBuilder::new(m.title.clone())
.subtitle(m.description)
.autocomplete(m.title)
.arg(format!("open {}", m.url))
.into_item()
})
.collect();
Ok(items)
}
pub fn query_screenboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
let results = self.db.screenboards().find(title, 10)?;
let items = results
.into_iter()
.map(|m| {
alfred::ItemBuilder::new(m.title.clone())
.subtitle(m.description)
.autocomplete(m.title)
.arg(format!("open {}", m.url))
.into_item()
})
.collect();
Ok(items)
}
pub fn query_dashboards<'items>(&self, title: &str) -> Result<Vec<Item<'items>>, Error> {
let results = self.db.find_dashboard(title, 10)?;
let items = results
.into_iter()
.map(|m| {
alfred::ItemBuilder::new(m.title.clone())
.subtitle(m.description)
.autocomplete(m.title)
.arg(format!("open {}", m.url))
.into_item()
})
.collect();
Ok(items)
}
pub fn query_monitors<'items>(
&mut self,
name: &str,
tag: Option<&str>,
) -> Result<Vec<Item<'items>>, Error> {
let results = self.db.monitors().find(name, tag, 10)?;
let items = results
.into_iter()
.map(|m| {
alfred::ItemBuilder::new(m.name.clone())
.subtitle(m.name.clone())
.autocomplete(m.name)
.arg(format!("open {}", m.url))
.into_item()
})
.collect();
Ok(items)
}
}