[pve-devel] [PATCH v4 proxmox 05/69] notify: preparation for the API
Lukas Wagner
l.wagner at proxmox.com
Thu Jul 20 16:31:32 CEST 2023
Signed-off-by: Lukas Wagner <l.wagner at 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 deebe046..f5bc687a 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
More information about the pve-devel
mailing list