use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::client::Client;
use crate::error::Result;
pub const MONITOR_PATH: &str = "api/v1/monitor";
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Monitor {
pub id: i64,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub overall_state: Option<String>,
#[serde(default, rename = "type")]
pub kind: Option<String>,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub query: Option<String>,
#[serde(default)]
pub message: Option<String>,
#[serde(flatten)]
pub extra: Value,
}
#[derive(Debug, Clone, Default)]
pub struct MonitorListFilter {
pub name: Option<String>,
pub tags: Option<String>,
pub monitor_tags: Option<String>,
}
impl Client {
pub async fn monitors_list(&self, filter: &MonitorListFilter) -> Result<Vec<Monitor>> {
let mut query: Vec<(&str, String)> = Vec::new();
if let Some(name) = &filter.name {
query.push(("name", name.clone()));
}
if let Some(tags) = &filter.tags {
query.push(("tags", tags.clone()));
}
if let Some(monitor_tags) = &filter.monitor_tags {
query.push(("monitor_tags", monitor_tags.clone()));
}
self.get_json(MONITOR_PATH, &query).await
}
pub async fn monitor_get(&self, id: i64) -> Result<Monitor> {
self.get_json(&format!("{MONITOR_PATH}/{id}"), &[]).await
}
}