From 6fc95b86283c3831d994f79c7803caac3697c080 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Wed, 14 Apr 2021 11:27:45 +0200 Subject: [PATCH] add proxmox::tools::serde::string_as_base64url_nopad Signed-off-by: Wolfgang Bumiller --- proxmox/src/tools/serde.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/proxmox/src/tools/serde.rs b/proxmox/src/tools/serde.rs index 13c38fb4..60e6a00c 100644 --- a/proxmox/src/tools/serde.rs +++ b/proxmox/src/tools/serde.rs @@ -180,3 +180,38 @@ pub mod bytes_as_base64url_nopad { }) } } + +/// Serialize `String` as base64url encoded string without padding. +/// +/// Usage example: +/// ``` +/// use serde::{Deserialize, Serialize}; +/// +/// # #[derive(Debug)] +/// #[derive(Deserialize, PartialEq, Serialize)] +/// struct Foo { +/// #[serde(with = "proxmox::tools::serde::string_as_base64url_nopad")] +/// data: String, +/// } +/// +/// let obj = Foo { data: "FOO".to_string() }; +/// let json = serde_json::to_string(&obj).unwrap(); +/// assert_eq!(json, r#"{"data":"Rk9P"}"#); +/// +/// let deserialized: Foo = serde_json::from_str(&json).unwrap(); +/// assert_eq!(obj, deserialized); +/// ``` +pub mod string_as_base64url_nopad { + use serde::Deserializer; + + pub use super::bytes_as_base64::serialize; + + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + use serde::de::Error; + let bytes = super::bytes_as_base64::deserialize::<'de, D>(deserializer)?; + String::from_utf8(bytes).map_err(|err| Error::custom(err.to_string())) + } +}