From fd992d7e3c03f37fbcafe9d3f26c72a2ead3b2a7 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Thu, 26 Sep 2024 17:31:16 -0500 Subject: feat!: impl full api --- src/lib.rs | 82 +++++++++++++++++++++++--------------------------------------- 1 file changed, 30 insertions(+), 52 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 3437dca..2c9fa91 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,61 +1,39 @@ -use std::ops::Range; +use std::path::PathBuf; -pub use crate::{ - error::{Error, Result}, - service::{Service, Status}, -}; +use serde::{Deserialize, Serialize}; +use service::Services; +use tower_http::services::ServeDir; +pub use crate::error::{Error, Result}; + +pub mod api; pub mod error; pub mod service; -pub fn generate(title: String, mut services: Vec, template: String) -> String { - let client = reqwest::blocking::Client::new(); - - let [up, down, unknown] = std::thread::scope(|s| { - let mut handles = Vec::new(); - for service in services.iter_mut() { - handles.push(s.spawn(|| service.check(client.clone()))); - } +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum Status { + #[default] + Pass, + Fail, + Warn, +} - handles - .into_iter() - .map(|h| h.join().expect("Joining thread")) - .fold([0, 0, 0], |[up, down, unknown], res| match res { - Ok(true) => [up + 1, down, unknown], - Ok(false) => [up, down + 1, unknown], - Err(_) => [up, down, unknown + 1], - }) - }); +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct Check { + pub status: Status, + pub output: Option, +} - template - .match_indices("{{services}}") - .zip(template.match_indices("{{end}}")) - .map(|(start, stop)| { - ( - start.0 + start.1.len()..stop.0, - start.0..stop.0 + stop.1.len(), - ) - }) - .collect::>() - .into_iter() - .fold(template, |mut template, (Range { start, end }, outer)| { - let replace_with = services - .iter() - .map(|service| { - template[start..end] - .replace("{name}", &service.name) - .replace("{title}", &service.kind.to_string()) - .replace("{state}", &service.state.to_string()) - .replace("{level}", &service.state.as_level()) - }) - .collect::(); +impl axum::response::IntoResponse for Check { + fn into_response(self) -> axum::response::Response { + axum::Json(self).into_response() + } +} - template.replace_range(outer, &replace_with); - template - }) - .replace("{title}", &title) - .replace("{status}", if down > 0 { "error" } else { "ok" }) - .replace("{up}", &up.to_string()) - .replace("{down}", &down.to_string()) - .replace("{unknown}", &unknown.to_string()) +pub fn router(root: PathBuf) -> axum::Router { + axum::Router::new() + .nest_service("/", ServeDir::new(root)) + .nest("/api", api::router()) + .layer(tower_http::trace::TraceLayer::new_for_http()) } -- cgit v1.2.3-70-g09d2