use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Check {
pub name: String,
pub tags: String,
pub desc: String,
pub grace: i64,
pub n_pings: i64,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_ping: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_ping: Option<String>,
pub manual_resume: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub ping_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub update_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pause_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schedule: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tz: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unique_key: Option<String>,
}
impl Check {
pub fn id(&self) -> Option<String> {
if let Some(ref url) = self.ping_url {
url.split('/').last().map(|id| id.to_owned())
} else {
None
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Channel {
pub id: String,
pub name: String,
pub kind: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct NewCheck {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub desc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grace: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schedule: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tz: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manual_resume: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unique: Option<Vec<String>>,
}
impl Default for NewCheck {
fn default() -> Self {
NewCheck {
name: None,
tags: None,
channels: None,
desc: None,
timeout: None,
grace: None,
schedule: None,
tz: None,
unique: None,
manual_resume: None,
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct UpdatedCheck {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub desc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grace: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schedule: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tz: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manual_resume: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<String>,
}
impl Default for UpdatedCheck {
fn default() -> Self {
UpdatedCheck {
name: None,
tags: None,
desc: None,
timeout: None,
grace: None,
schedule: None,
tz: None,
manual_resume: None,
channels: None,
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Ping {
#[serde(rename = "type")]
pub type_field: String,
pub date: String,
pub n: i64,
pub scheme: String,
pub remote_addr: String,
pub method: String,
pub ua: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<f64>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Flip {
pub timestamp: String,
pub up: i64,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::to_value;
#[test]
fn new_check_does_not_serialize_nulls() {
let new_check: NewCheck = Default::default();
let value = to_value(new_check);
assert!(value.is_ok());
assert_eq!(value.unwrap().to_string(), "{}");
}
#[test]
fn updated_check_does_not_serialize_nulls() {
let updated_check: UpdatedCheck = Default::default();
let value = to_value(updated_check);
assert!(value.is_ok());
assert_eq!(value.unwrap().to_string(), "{}");
}
#[test]
fn default_impl_for_updated_check_fills_nulls() {
let updated_check = UpdatedCheck {
name: Some("Updated check".to_string()),
..Default::default()
};
let value = to_value(updated_check);
assert!(value.is_ok());
assert_eq!(value.unwrap().to_string(), "{\"name\":\"Updated check\"}");
}
}