summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2024-09-26 17:31:16 -0500
committerToby Vincent <tobyv@tobyvin.dev>2024-09-26 17:31:16 -0500
commitfd992d7e3c03f37fbcafe9d3f26c72a2ead3b2a7 (patch)
treef3e29427d1bbe4a8d6e050abbd9f66afb5fa2152 /src/lib.rs
parentcbfca14b38806798847e3f2008038b25194a9b8b (diff)
feat!: impl full api
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs82
1 files changed, 30 insertions, 52 deletions
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<Service>, 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<String>,
+}
- 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::<Vec<_>>()
- .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::<String>();
+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<Services> {
+ axum::Router::new()
+ .nest_service("/", ServeDir::new(root))
+ .nest("/api", api::router())
+ .layer(tower_http::trace::TraceLayer::new_for_http())
}