diff --git a/Cargo.lock b/Cargo.lock index 511765a4b..fbbd33bf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1056,9 +1056,12 @@ dependencies = [ name = "monitor_types" version = "1.0.0" dependencies = [ + "anyhow", "async-trait", + "axum", "diff-struct", "serde", + "serde_json", "strum", "strum_macros", "typeshare", diff --git a/lib/periphery_client/src/lib.rs b/lib/periphery_client/src/lib.rs index e3b72b222..b3236b1f3 100644 --- a/lib/periphery_client/src/lib.rs +++ b/lib/periphery_client/src/lib.rs @@ -2,7 +2,7 @@ extern crate log; use anyhow::{anyhow, Context}; -use monitor_types::{HasResponse, periphery_api::requests}; +use monitor_types::api::{periphery::requests, HasResponse}; use reqwest::StatusCode; use serde_json::json; diff --git a/lib/types/Cargo.toml b/lib/types/Cargo.toml index e127c5da4..21b4273e7 100644 --- a/lib/types/Cargo.toml +++ b/lib/types/Cargo.toml @@ -8,8 +8,11 @@ license.workspace = true [dependencies] serde.workspace = true +serde_json.workspace = true +axum.workspace = true diff-struct.workspace = true typeshare.workspace = true strum.workspace = true strum_macros.workspace = true -async-trait.workspace = true \ No newline at end of file +async-trait.workspace = true +anyhow.workspace = true \ No newline at end of file diff --git a/lib/types/src/core_api/mod.rs b/lib/types/src/api/core/mod.rs similarity index 100% rename from lib/types/src/core_api/mod.rs rename to lib/types/src/api/core/mod.rs diff --git a/lib/types/src/api/mod.rs b/lib/types/src/api/mod.rs new file mode 100644 index 000000000..5a81e0468 --- /dev/null +++ b/lib/types/src/api/mod.rs @@ -0,0 +1,41 @@ +use anyhow::Context; +use axum::{headers::ContentType, http::StatusCode, TypedHeader}; +use serde::{de::DeserializeOwned, Serialize}; + +pub mod core; +pub mod periphery; + +pub trait HasResponse: Serialize + DeserializeOwned + std::fmt::Debug + Send + 'static { + type Response: Serialize + DeserializeOwned + std::fmt::Debug; + fn req_type() -> &'static str; +} + +#[async_trait::async_trait] +pub trait Resolve { + async fn resolve(&self, req: Req) -> anyhow::Result; + async fn resolve_to_response( + &self, + req: Req, + ) -> Result<(TypedHeader, String), (StatusCode, String)> { + let res = self + .resolve(req) + .await + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}")))?; + let res = serde_json::to_string(&res) + .context("failed at serializing response") + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}")))?; + Ok((TypedHeader(ContentType::json()), res)) + } +} + +#[macro_export] +macro_rules! impl_has_response { + ($req:ty, $res:ty) => { + impl $crate::api::HasResponse for $req { + type Response = $res; + fn req_type() -> &'static str { + stringify!($req) + } + } + }; +} diff --git a/lib/types/src/periphery_api/mod.rs b/lib/types/src/api/periphery/mod.rs similarity index 82% rename from lib/types/src/periphery_api/mod.rs rename to lib/types/src/api/periphery/mod.rs index 6e08baeaf..4cf86dcf1 100644 --- a/lib/types/src/periphery_api/mod.rs +++ b/lib/types/src/api/periphery/mod.rs @@ -1,8 +1,11 @@ use serde::{Deserialize, Serialize}; -use crate::SystemCommand; +use crate::entities::SystemCommand; -use self::requests::{GetHealth, GetVersion, GetSystemInformation, GetBasicSystemStats, GetDiskUsage, GetNetworkUsage, GetSystemProcesses, GetAllSystemStats, GetSystemComponents, GetCpuUsage}; +use self::requests::{ + GetAllSystemStats, GetBasicSystemStats, GetCpuUsage, GetDiskUsage, GetHealth, GetNetworkUsage, + GetSystemComponents, GetSystemInformation, GetSystemProcesses, GetVersion, +}; pub mod requests; diff --git a/lib/types/src/periphery_api/requests.rs b/lib/types/src/api/periphery/requests.rs similarity index 100% rename from lib/types/src/periphery_api/requests.rs rename to lib/types/src/api/periphery/requests.rs diff --git a/lib/types/src/entities/mod.rs b/lib/types/src/entities/mod.rs index 3420c2185..4de3dd1c1 100644 --- a/lib/types/src/entities/mod.rs +++ b/lib/types/src/entities/mod.rs @@ -1,2 +1,129 @@ +use diff::Diff; +use serde::{Deserialize, Serialize}; +use strum_macros::{Display, EnumString}; +use typeshare::typeshare; + pub mod server; +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, Diff)] +#[diff(attr(#[derive(Debug, PartialEq, Serialize)]))] +pub struct SystemCommand { + #[serde(default)] + pub path: String, + #[serde(default)] + pub command: String, +} + +#[typeshare] +#[derive( + Serialize, + Deserialize, + Debug, + Display, + EnumString, + PartialEq, + Hash, + Eq, + Clone, + Copy, + Diff, + Default, +)] +#[serde(rename_all = "snake_case")] +#[strum(serialize_all = "snake_case")] +#[diff(attr(#[derive(Debug, PartialEq, Serialize)]))] +pub enum Timelength { + #[serde(rename = "1-sec")] + #[strum(serialize = "1-sec")] + OneSecond, + #[serde(rename = "5-sec")] + #[strum(serialize = "5-sec")] + FiveSeconds, + #[serde(rename = "10-sec")] + #[strum(serialize = "10-sec")] + TenSeconds, + #[serde(rename = "15-sec")] + #[strum(serialize = "15-sec")] + FifteenSeconds, + #[serde(rename = "30-sec")] + #[strum(serialize = "30-sec")] + ThirtySeconds, + #[default] + #[serde(rename = "1-min")] + #[strum(serialize = "1-min")] + OneMinute, + #[serde(rename = "2-min")] + #[strum(serialize = "2-min")] + TwoMinutes, + #[serde(rename = "5-min")] + #[strum(serialize = "5-min")] + FiveMinutes, + #[serde(rename = "10-min")] + #[strum(serialize = "10-min")] + TenMinutes, + #[serde(rename = "15-min")] + #[strum(serialize = "15-min")] + FifteenMinutes, + #[serde(rename = "30-min")] + #[strum(serialize = "30-min")] + ThirtyMinutes, + #[serde(rename = "1-hr")] + #[strum(serialize = "1-hr")] + OneHour, + #[serde(rename = "2-hr")] + #[strum(serialize = "2-hr")] + TwoHours, + #[serde(rename = "6-hr")] + #[strum(serialize = "6-hr")] + SixHours, + #[serde(rename = "8-hr")] + #[strum(serialize = "8-hr")] + EightHours, + #[serde(rename = "12-hr")] + #[strum(serialize = "12-hr")] + TwelveHours, + #[serde(rename = "1-day")] + #[strum(serialize = "1-day")] + OneDay, + #[serde(rename = "3-day")] + #[strum(serialize = "3-day")] + ThreeDay, + #[serde(rename = "1-wk")] + #[strum(serialize = "1-wk")] + OneWeek, + #[serde(rename = "2-wk")] + #[strum(serialize = "2-wk")] + TwoWeeks, + #[serde(rename = "30-day")] + #[strum(serialize = "30-day")] + ThirtyDays, +} + +#[typeshare] +#[derive( + Serialize, + Deserialize, + Debug, + Display, + EnumString, + Hash, + Clone, + Copy, + Diff, + PartialEq, + Eq, + PartialOrd, + Ord, + Default, +)] +#[serde(rename_all = "snake_case")] +#[strum(serialize_all = "snake_case")] +#[diff(attr(#[derive(Debug, PartialEq, Serialize)]))] +pub enum PermissionLevel { + #[default] + None, + Read, + Execute, + Update, +} diff --git a/lib/types/src/entities/server.rs b/lib/types/src/entities/server.rs index a23f1a425..bbe1b6a29 100644 --- a/lib/types/src/entities/server.rs +++ b/lib/types/src/entities/server.rs @@ -1,9 +1,11 @@ use std::path::PathBuf; -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{I64, Timelength}; +use crate::I64; + +use super::Timelength; #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Default)] @@ -119,4 +121,4 @@ pub struct SystemComponent { pub max: f32, #[serde(skip_serializing_if = "Option::is_none")] pub critical: Option, -} \ No newline at end of file +} diff --git a/lib/types/src/lib.rs b/lib/types/src/lib.rs index c906f14a5..374793cca 100644 --- a/lib/types/src/lib.rs +++ b/lib/types/src/lib.rs @@ -1,157 +1,7 @@ -use diff::Diff; -use serde::{de::DeserializeOwned, Deserialize, Serialize}; -use strum_macros::{Display, EnumString}; use typeshare::typeshare; -pub mod core_api; +pub mod api; pub mod entities; -pub mod periphery_api; #[typeshare(serialized_as = "number")] pub type I64 = i64; - -#[typeshare] -#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, Diff)] -#[diff(attr(#[derive(Debug, PartialEq, Serialize)]))] -pub struct SystemCommand { - #[serde(default)] - pub path: String, - #[serde(default)] - pub command: String, -} - -#[typeshare] -#[derive( - Serialize, - Deserialize, - Debug, - Display, - EnumString, - PartialEq, - Hash, - Eq, - Clone, - Copy, - Diff, - Default, -)] -#[serde(rename_all = "snake_case")] -#[strum(serialize_all = "snake_case")] -#[diff(attr(#[derive(Debug, PartialEq, Serialize)]))] -pub enum Timelength { - #[serde(rename = "1-sec")] - #[strum(serialize = "1-sec")] - OneSecond, - #[serde(rename = "5-sec")] - #[strum(serialize = "5-sec")] - FiveSeconds, - #[serde(rename = "10-sec")] - #[strum(serialize = "10-sec")] - TenSeconds, - #[serde(rename = "15-sec")] - #[strum(serialize = "15-sec")] - FifteenSeconds, - #[serde(rename = "30-sec")] - #[strum(serialize = "30-sec")] - ThirtySeconds, - #[default] - #[serde(rename = "1-min")] - #[strum(serialize = "1-min")] - OneMinute, - #[serde(rename = "2-min")] - #[strum(serialize = "2-min")] - TwoMinutes, - #[serde(rename = "5-min")] - #[strum(serialize = "5-min")] - FiveMinutes, - #[serde(rename = "10-min")] - #[strum(serialize = "10-min")] - TenMinutes, - #[serde(rename = "15-min")] - #[strum(serialize = "15-min")] - FifteenMinutes, - #[serde(rename = "30-min")] - #[strum(serialize = "30-min")] - ThirtyMinutes, - #[serde(rename = "1-hr")] - #[strum(serialize = "1-hr")] - OneHour, - #[serde(rename = "2-hr")] - #[strum(serialize = "2-hr")] - TwoHours, - #[serde(rename = "6-hr")] - #[strum(serialize = "6-hr")] - SixHours, - #[serde(rename = "8-hr")] - #[strum(serialize = "8-hr")] - EightHours, - #[serde(rename = "12-hr")] - #[strum(serialize = "12-hr")] - TwelveHours, - #[serde(rename = "1-day")] - #[strum(serialize = "1-day")] - OneDay, - #[serde(rename = "3-day")] - #[strum(serialize = "3-day")] - ThreeDay, - #[serde(rename = "1-wk")] - #[strum(serialize = "1-wk")] - OneWeek, - #[serde(rename = "2-wk")] - #[strum(serialize = "2-wk")] - TwoWeeks, - #[serde(rename = "30-day")] - #[strum(serialize = "30-day")] - ThirtyDays, -} - -#[typeshare] -#[derive( - Serialize, - Deserialize, - Debug, - Display, - EnumString, - Hash, - Clone, - Copy, - Diff, - PartialEq, - Eq, - PartialOrd, - Ord, - Default, -)] -#[serde(rename_all = "snake_case")] -#[strum(serialize_all = "snake_case")] -#[diff(attr(#[derive(Debug, PartialEq, Serialize)]))] -pub enum PermissionLevel { - #[default] - None, - Read, - Execute, - Update, -} - -pub trait HasResponse: Serialize + std::fmt::Debug { - type Response: DeserializeOwned + std::fmt::Debug; - fn req_type() -> &'static str; -} - -#[async_trait::async_trait] -pub trait Resolve { - async fn resolve(&self, req: Req) -> Req::Response; -} - -#[macro_export] -macro_rules! impl_has_response { - ($req:ty, $res:ty) => { - impl $crate::HasResponse for $req { - type Response = $res; - fn req_type() -> &'static str { - stringify!($req) - } - } - }; -} - diff --git a/periphery/src/api/mod.rs b/periphery/src/api/mod.rs index 461c3d4ba..488515bc1 100644 --- a/periphery/src/api/mod.rs +++ b/periphery/src/api/mod.rs @@ -1,5 +1,11 @@ use anyhow::{anyhow, Context}; -use monitor_types::{periphery_api::{requests::{GetVersionResponse, GetHealth, GetHealthResponse, GetVersion}, PeripheryRequest}, Resolve}; +use monitor_types::api::{ + periphery::{ + requests::{GetHealth, GetHealthResponse, GetVersion, GetVersionResponse}, + PeripheryRequest, + }, + Resolve, +}; use crate::state::State; @@ -23,16 +29,16 @@ fn get_version() -> anyhow::Result { .context("failed to convert version to string") } -#[async_trait::async_trait] -impl Resolve for State { - async fn resolve(&self, _: GetHealth) -> GetHealthResponse { - GetHealthResponse {} - } -} +// #[async_trait::async_trait] +// impl Resolve for State { +// async fn resolve(&self, _: GetHealth) -> GetHealthResponse { +// GetHealthResponse {} +// } +// } -#[async_trait::async_trait] -impl Resolve for State { - async fn resolve(&self, _: GetVersion) -> GetVersionResponse { - todo!() - } -} +// #[async_trait::async_trait] +// impl Resolve for State { +// async fn resolve(&self, _: GetVersion) -> GetVersionResponse { +// todo!() +// } +// } diff --git a/periphery/src/config.rs b/periphery/src/config.rs index 8a922f354..d9b60dd33 100644 --- a/periphery/src/config.rs +++ b/periphery/src/config.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, net::IpAddr, path::PathBuf}; use anyhow::Context; use clap::Parser; use merge_config_files::parse_config_paths; -use monitor_types::Timelength; +use monitor_types::entities::Timelength; use parse_csl::parse_comma_seperated; use serde::{Deserialize, Serialize}; diff --git a/periphery/src/helpers/stats.rs b/periphery/src/helpers/stats.rs index e516b60d4..a775805f0 100644 --- a/periphery/src/helpers/stats.rs +++ b/periphery/src/helpers/stats.rs @@ -1,8 +1,8 @@ use std::{cmp::Ordering, sync::Arc}; use async_timing_util::wait_until_timelength; -use monitor_types::{ - entities::server::{ +use monitor_types::entities::{ + server::{ AllSystemStats, BasicSystemStats, CpuUsage, DiskUsage, NetworkUsage, SingleCpuUsage, SingleDiskUsage, SystemComponent, SystemInformation, SystemNetwork, SystemProcess, }, diff --git a/periphery/src/main.rs b/periphery/src/main.rs index 34f0a26c1..d207b9390 100644 --- a/periphery/src/main.rs +++ b/periphery/src/main.rs @@ -7,7 +7,7 @@ use axum::{ headers::ContentType, http::StatusCode, middleware, routing::post, Extension, Json, Router, TypedHeader, }; -use monitor_types::periphery_api::PeripheryRequest; +use monitor_types::api::periphery::PeripheryRequest; use state::State; use termination_signal::tokio::immediate_term_handle; use uuid::Uuid; @@ -15,8 +15,8 @@ use uuid::Uuid; mod api; mod config; mod guard; -mod state; mod helpers; +mod state; async fn app() -> anyhow::Result<()> { let state = State::load().await?; diff --git a/tests/src/main.rs b/tests/src/main.rs index eb6629794..b82d5977a 100644 --- a/tests/src/main.rs +++ b/tests/src/main.rs @@ -1,4 +1,4 @@ -use monitor_types::periphery_api::requests; +use monitor_types::api::periphery::requests; use periphery_client::PeripheryClient; #[tokio::main]