// Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 #[cfg(feature = "base64")] pub mod base64 { use base64::{Engine as _, engine::general_purpose::STANDARD}; use serde::{Deserialize, Deserializer, Serializer}; pub fn serialize(bytes: &[u8], serializer: S) -> Result { serializer.serialize_str(&STANDARD.encode(bytes)) } pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { let s = ::deserialize(deserializer)?; STANDARD.decode(s).map_err(serde::de::Error::custom) } } #[cfg(feature = "bs58")] pub mod bs58 { use serde::{Deserialize, Deserializer, Serializer}; pub fn serialize(bytes: &[u8], serializer: S) -> Result { serializer.serialize_str(&::bs58::encode(bytes).into_string()) } pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { let s = String::deserialize(deserializer)?; ::bs58::decode(&s) .into_vec() .map_err(serde::de::Error::custom) } } #[cfg(feature = "hex")] pub mod hex { use serde::{Deserialize, Deserializer, Serializer}; pub fn serialize(bytes: &[u8], serializer: S) -> Result { serializer.serialize_str(&::hex::encode(bytes)) } pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { let s = String::deserialize(deserializer)?; ::hex::decode(&s).map_err(serde::de::Error::custom) } } #[cfg(feature = "date")] pub mod date { use serde::ser::Error; use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; use time::Date; use time::format_description::{BorrowedFormatItem, Component, modifier}; // simple YYYY-MM-DD pub const DATE_FORMAT: &[BorrowedFormatItem<'_>] = &[ BorrowedFormatItem::Component(Component::Year(modifier::Year::default())), BorrowedFormatItem::Literal(b"-"), BorrowedFormatItem::Component(Component::Month(modifier::Month::default())), BorrowedFormatItem::Literal(b"-"), BorrowedFormatItem::Component(Component::Day(modifier::Day::default())), ]; pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; Date::parse(&s, DATE_FORMAT).map_err(de::Error::custom) } pub fn serialize(datetime: &Date, serializer: S) -> Result where S: Serializer, { // serialize it with human-readable format for compatibility with eclipse and nutella clients // in the future change it back to rfc3339 datetime .format(&DATE_FORMAT) .map_err(S::Error::custom)? .serialize(serializer) } }