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";
const MAX_RETRIES: i8 = 20;
#[allow(clippy::module_name_repetitions)]
pub struct PingClient {
pub(crate) uuid: String,
pub(crate) user_agent: String,
pub(crate) ureq_agent: Agent,
pub(crate) api_url: String,
}
pub fn get_client(uuid: &str) -> Result<PingClient, HealthchecksConfigError> {
get_client_with_url(uuid, HEALTHCHECK_PING_URL)
}
pub fn get_client_with_url(
uuid: &str,
api_url: &str,
) -> Result<PingClient, HealthchecksConfigError> {
if Uuid::parse_str(uuid).is_err() {
Err(HealthchecksConfigError::InvalidUuid(uuid.to_string()))
} else if api_url.is_empty() {
Err(HealthchecksConfigError::EmptyApiUrl)
} else {
Ok(PingClient {
uuid: uuid.to_owned(),
user_agent: default_user_agent().to_owned(),
ureq_agent: AgentBuilder::new().timeout(Duration::from_secs(5)).build(),
api_url: HEALTHCHECK_PING_URL.to_owned(),
})
}
}
impl PingClient {
#[must_use]
pub fn set_user_agent(mut self, user_agent: &str) -> PingClient {
self.user_agent = user_agent.to_owned();
self
}
#[must_use]
pub fn report_success(&self) -> bool {
let mut retries: i8 = 0;
let request = self
.ureq_agent
.get(&format!("{}/{}", self.api_url, self.uuid))
.set("User-Agent", &self.user_agent);
while retries < MAX_RETRIES {
let resp = request.clone().call();
if resp.is_ok() {
return true;
}
retries += 1;
}
if request.call().is_ok() {
return true;
}
false
}
#[must_use]
pub fn report_failure(&self) -> bool {
let mut retries: i8 = 0;
let request = self
.ureq_agent
.get(&format!("{}/{}/fail", self.api_url, self.uuid))
.set("User-Agent", &self.user_agent);
while retries < MAX_RETRIES {
let resp = request.clone().call();
if resp.is_ok() {
return true;
}
retries += 1;
}
if request.call().is_ok() {
return true;
}
false
}
#[must_use]
pub fn report_failure_with_logs(&self, data: &str) -> bool {
let mut retries: i8 = 0;
let request = self
.ureq_agent
.post(&format!("{}/{}/fail", self.api_url, self.uuid))
.set("User-Agent", &self.user_agent);
while retries < MAX_RETRIES {
let resp = request.clone().send_string(data);
if resp.is_ok() {
return true;
}
retries += 1;
}
if request.send_string(data).is_ok() {
return true;
}
false
}
#[must_use]
pub fn start_timer(&self) -> bool {
let mut retries: i8 = 0;
let request = self
.ureq_agent
.get(&format!("{}/{}/start", self.api_url, self.uuid))
.set("User-Agent", &self.user_agent);
while retries < MAX_RETRIES {
let resp = request.clone().call();
if resp.is_ok() {
return true;
}
retries += 1;
}
if request.call().is_ok() {
return true;
}
false
}
}