use crate::errors::HealthchecksConfigError;
use crate::util::default_user_agent;
use std::result::Result;
use std::time::Duration;
use ureq::{Agent, AgentBuilder};
use uuid::Uuid;
const HEALTHCHECK_PING_URL: &str = "https://hc-ping.com";
pub struct PingClient {
pub(crate) uuid: String,
pub(crate) user_agent: String,
pub(crate) ureq_agent: Agent,
}
pub fn get_client(uuid: &str) -> Result<PingClient, HealthchecksConfigError> {
if Uuid::parse_str(uuid).is_err() {
Err(HealthchecksConfigError::InvalidUuid(uuid.to_string()))
} else {
Ok(PingClient {
uuid: uuid.to_owned(),
user_agent: default_user_agent().to_owned(),
ureq_agent: AgentBuilder::new().timeout(Duration::from_secs(5)).build(),
})
}
}
impl PingClient {
pub fn set_user_agent(mut self, user_agent: &str) -> PingClient {
self.user_agent = user_agent.to_owned();
self
}
pub fn report_success(&self) -> bool {
let request = self
.ureq_agent
.get(&format!("{}/{}", HEALTHCHECK_PING_URL, self.uuid))
.set("User-Agent", &self.user_agent);
if request.call().is_ok() {
return true;
}
false
}
pub fn report_failure(&self) -> bool {
let request = self
.ureq_agent
.get(&format!("{}/{}/fail", HEALTHCHECK_PING_URL, self.uuid))
.set("User-Agent", &self.user_agent);
if request.call().is_ok() {
return true;
}
false
}
pub fn report_failure_with_logs(&self, data: &str) -> bool {
let request = self
.ureq_agent
.post(&format!("{}/{}/fail", HEALTHCHECK_PING_URL, self.uuid))
.set("User-Agent", &self.user_agent);
if request.send_string(data).is_ok() {
return true;
}
false
}
pub fn start_timer(&self) -> bool {
let request = self
.ureq_agent
.get(&format!("{}/{}/start", HEALTHCHECK_PING_URL, self.uuid))
.set("User-Agent", &self.user_agent);
if request.call().is_ok() {
return true;
}
false
}
}