Skip to main content

datadog_workflow_lib/
workflow.rs

1use crate::database::DbContext;
2use crate::datadog::Api;
3use crate::errors::Error;
4use alfred::Item;
5use std::str;
6
7pub struct Workflow<'a> {
8    api_key: &'a str,
9    application_key: &'a str,
10    api_url: &'a str,
11    db: DbContext,
12    subdomain: &'a str,
13}
14
15impl<'a> Workflow<'a> {
16    /// Creates a new `DataDog` workflow for use.
17    ///
18    /// # Errors
19    /// Can return when database error occurs.
20    #[inline]
21    pub fn new(
22        api_key: &'a str,
23        application_key: &'a str,
24        database_url: &str,
25        api_url: &'a str,
26        subdomain: &'a str,
27    ) -> Result<Self, Error> {
28        let db = DbContext::new(database_url, subdomain.to_owned())?;
29        Ok(Workflow {
30            api_key,
31            application_key,
32            api_url,
33            db,
34            subdomain,
35        })
36    }
37
38    /// Refreshes cached data from `DataDog` API
39    ///
40    /// # Errors
41    /// can return when database error occurs or API.
42    pub fn refresh_cache(&mut self) -> Result<(), Error> {
43        let datadog_api = Api::new(
44            self.api_key,
45            self.application_key,
46            self.api_url,
47            self.subdomain,
48        );
49        self.db.run_migrations()?;
50        self.refresh_timeboards(&datadog_api)?;
51        self.refresh_screenboards(&datadog_api)?;
52        self.refresh_monitors(&datadog_api)?;
53
54        // and DB cleanup work
55        Ok(self.db.optimize()?)
56    }
57
58    fn refresh_timeboards(&mut self, datadog_api: &Api) -> Result<(), Error> {
59        let mut db = self.db.timeboards();
60        db.delete_all()?;
61        let results = datadog_api.get_timeboards()?;
62        db.insert(&results)?;
63        Ok(())
64    }
65
66    fn refresh_screenboards(&mut self, datadog_api: &Api) -> Result<(), Error> {
67        let mut db = self.db.screenboards();
68        db.delete_all()?;
69        let results = datadog_api.get_screenboards()?;
70        db.insert(&results)?;
71        Ok(())
72    }
73
74    fn refresh_monitors(&mut self, datadog_api: &Api) -> Result<(), Error> {
75        let mut db = self.db.monitors();
76        db.delete_all()?;
77        let results = datadog_api.get_monitors()?;
78        db.insert(&results)?;
79        Ok(())
80    }
81
82    /// Query `DataDog` Time Boards
83    ///
84    /// # Errors
85    /// can return when database error occurs.
86    pub fn query_timeboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
87        let results = self.db.timeboards().find(title, 10)?;
88        let items = results
89            .into_iter()
90            .map(|m| {
91                alfred::ItemBuilder::new(m.title.clone())
92                    .subtitle(m.description)
93                    .autocomplete(m.title)
94                    .arg(format!("open {}", m.url))
95                    .into_item()
96            })
97            .collect();
98        Ok(items)
99    }
100
101    /// Query `DataDog` Screen Boards
102    ///
103    /// # Errors
104    /// can return when database error occurs.
105    pub fn query_screenboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
106        let results = self.db.screenboards().find(title, 10)?;
107        let items = results
108            .into_iter()
109            .map(|m| {
110                alfred::ItemBuilder::new(m.title.clone())
111                    .subtitle(m.description)
112                    .autocomplete(m.title)
113                    .arg(format!("open {}", m.url))
114                    .into_item()
115            })
116            .collect();
117        Ok(items)
118    }
119
120    /// Query `DataDog` Dashboards
121    ///
122    /// # Errors
123    /// can return when database error occurs.
124    pub fn query_dashboards<'items>(&self, title: &str) -> Result<Vec<Item<'items>>, Error> {
125        let results = self.db.find_dashboard(title, 10)?;
126        let items = results
127            .into_iter()
128            .map(|m| {
129                alfred::ItemBuilder::new(m.title.clone())
130                    .subtitle(m.description)
131                    .autocomplete(m.title)
132                    .arg(format!("open {}", m.url))
133                    .into_item()
134            })
135            .collect();
136        Ok(items)
137    }
138
139    /// Query `DataDog` Monitors
140    ///
141    /// # Errors
142    /// can return when database error occurs.
143    pub fn query_monitors<'items>(
144        &mut self,
145        name: &str,
146        tag: Option<&str>,
147    ) -> Result<Vec<Item<'items>>, Error> {
148        let results = self.db.monitors().find(name, tag, 10)?;
149        let items = results
150            .into_iter()
151            .map(|m| {
152                alfred::ItemBuilder::new(m.name.clone())
153                    .subtitle(m.name.clone())
154                    .autocomplete(m.name)
155                    .arg(format!("open {}", m.url))
156                    .into_item()
157            })
158            .collect();
159        Ok(items)
160    }
161}