1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::client::Client;
5use crate::error::Result;
6
7pub const MONITOR_PATH: &str = "api/v1/monitor";
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
14pub struct Monitor {
15 pub id: i64,
16 #[serde(default)]
17 pub name: Option<String>,
18 #[serde(default)]
20 pub overall_state: Option<String>,
21 #[serde(default, rename = "type")]
22 pub kind: Option<String>,
23 #[serde(default)]
24 pub tags: Vec<String>,
25 #[serde(default)]
26 pub query: Option<String>,
27 #[serde(default)]
28 pub message: Option<String>,
29 #[serde(flatten)]
30 pub extra: Value,
31}
32
33#[derive(Debug, Clone, Default)]
36pub struct MonitorListFilter {
37 pub name: Option<String>,
39 pub tags: Option<String>,
41 pub monitor_tags: Option<String>,
43}
44
45impl Client {
46 pub async fn monitors_list(&self, filter: &MonitorListFilter) -> Result<Vec<Monitor>> {
47 let mut query: Vec<(&str, String)> = Vec::new();
48 if let Some(name) = &filter.name {
49 query.push(("name", name.clone()));
50 }
51 if let Some(tags) = &filter.tags {
52 query.push(("tags", tags.clone()));
53 }
54 if let Some(monitor_tags) = &filter.monitor_tags {
55 query.push(("monitor_tags", monitor_tags.clone()));
56 }
57 self.get_json(MONITOR_PATH, &query).await
58 }
59
60 pub async fn monitor_get(&self, id: i64) -> Result<Monitor> {
61 self.get_json(&format!("{MONITOR_PATH}/{id}"), &[]).await
62 }
63}