Signed-off-by: Lukas Wagner <l.wag...@proxmox.com> --- proxmox-notify/src/api/mod.rs | 94 +++++++++++++++++++++++++++++++++++ proxmox-notify/src/lib.rs | 1 + 2 files changed, 95 insertions(+) create mode 100644 proxmox-notify/src/api/mod.rs
diff --git a/proxmox-notify/src/api/mod.rs b/proxmox-notify/src/api/mod.rs new file mode 100644 index 00000000..be596b93 --- /dev/null +++ b/proxmox-notify/src/api/mod.rs @@ -0,0 +1,94 @@ +use std::error::Error as StdError; +use std::fmt::Display; + +use crate::Config; +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct ApiError { + /// HTTP Error code + code: u16, + /// Error message + message: String, + #[serde(skip_serializing)] + /// The underlying cause of the error + source: Option<Box<dyn StdError + Send + Sync + 'static>>, +} + +impl ApiError { + fn new<S: AsRef<str>>( + message: S, + code: u16, + source: Option<Box<dyn StdError + Send + Sync + 'static>>, + ) -> Self { + Self { + message: message.as_ref().into(), + code, + source, + } + } + + pub fn bad_request<S: AsRef<str>>( + message: S, + source: Option<Box<dyn StdError + Send + Sync + 'static>>, + ) -> Self { + Self::new(message, 400, source) + } + + pub fn not_found<S: AsRef<str>>( + message: S, + source: Option<Box<dyn StdError + Send + Sync + 'static>>, + ) -> Self { + Self::new(message, 404, source) + } + + pub fn internal_server_error<S: AsRef<str>>( + message: S, + source: Option<Box<dyn StdError + Send + Sync + 'static>>, + ) -> Self { + Self::new(message, 500, source) + } +} + +impl Display for ApiError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&format!("{} {}", self.code, self.message)) + } +} + +impl StdError for ApiError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + match &self.source { + None => None, + Some(source) => Some(&**source), + } + } +} + +fn verify_digest(config: &Config, digest: Option<&[u8]>) -> Result<(), ApiError> { + if let Some(digest) = digest { + if config.digest != *digest { + return Err(ApiError::bad_request( + "detected modified configuration - file changed by other user? Try again.", + None, + )); + } + } + + Ok(()) +} + +fn endpoint_exists(config: &Config, name: &str) -> bool { + let mut exists = false; + + exists +} + +#[cfg(test)] +mod test_helpers { + use crate::Config; + + pub fn empty_config() -> Config { + Config::new("", "").unwrap() + } +} diff --git a/proxmox-notify/src/lib.rs b/proxmox-notify/src/lib.rs index 7b90ee15..43feac25 100644 --- a/proxmox-notify/src/lib.rs +++ b/proxmox-notify/src/lib.rs @@ -9,6 +9,7 @@ use serde_json::Value; use std::error::Error as StdError; +pub mod api; mod config; pub mod endpoints; pub mod schema; -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel