use serde_derive::{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,
#[cfg(feature = "v2")]
pub started: bool,
#[cfg(feature = "v3")]
pub slug: Option<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 {
#[must_use]
pub fn id(&self) -> Option<String> {
if let Some(ref url) = self.ping_url {
url.split('/').last().map(std::borrow::ToOwned::to_owned)
} else {
None
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Channel {
pub id: String,
pub name: String,
pub kind: String,
}
#[derive(Clone, Debug, Default, 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>>,
}
#[derive(Clone, Debug, Default, 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>,
}
#[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();
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();
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\"}");
}
}