pub mod bytes_as_base64 {
use serde::{de, Deserialize, Deserializer, Serializer};
use std::borrow::Cow;
pub fn serialize<S>(arr: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&base64::encode(arr))
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
where
D: Deserializer<'de>,
{
let s = Cow::<'_, str>::deserialize(deserializer)?;
Ok(base64::decode(s.as_ref()).map_err(de::Error::custom)?)
}
}
pub mod bytes_as_str {
use serde::{ser, Deserialize, Deserializer, Serializer};
pub fn serialize<S>(arr: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(std::str::from_utf8(arr).map_err(ser::Error::custom)?)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Ok(s.into_bytes())
}
}
pub mod bytes_as_base58 {
use serde::{de, Deserialize, Deserializer, Serializer};
use std::borrow::Cow;
pub fn serialize<S>(arr: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&bs58::encode(arr).into_string())
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
where
D: Deserializer<'de>,
{
let s = Cow::<'_, str>::deserialize(deserializer)?;
Ok(bs58::decode(s.as_ref()).into_vec().map_err(de::Error::custom)?)
}
}
pub mod vec_bytes_as_str {
use std::fmt;
use serde::de::{SeqAccess, Visitor};
use serde::ser::{self, SerializeSeq};
use serde::{Deserializer, Serializer};
pub fn serialize<S>(data: &Vec<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(data.len()))?;
for v in data {
seq.serialize_element(&std::str::from_utf8(v.as_slice()).map_err(ser::Error::custom)?)?;
}
seq.end()
}
struct VecBytesVisitor;
impl<'de> Visitor<'de> for VecBytesVisitor {
type Value = Vec<Vec<u8>>;
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("an array with string in the first element")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Vec<Vec<u8>>, A::Error>
where
A: SeqAccess<'de>,
{
let mut vec = Vec::new();
while let Some(s) = seq.next_element::<String>()? {
vec.push(s.into_bytes());
}
Ok(vec)
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(VecBytesVisitor {})
}
}
pub mod u128_dec_format {
use serde::de;
use serde::{Deserialize, Deserializer, Serializer};
use std::borrow::Cow;
pub fn serialize<S>(num: &u128, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&format!("{}", num))
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<u128, D::Error>
where
D: Deserializer<'de>,
{
let s = Cow::<'_, str>::deserialize(deserializer)?;
u128::from_str_radix(&s, 10).map_err(de::Error::custom)
}
}
pub mod u128_dec_format_compatible {
use serde::{de, Deserialize, Deserializer};
pub use super::u128_dec_format::serialize;
#[derive(Deserialize)]
#[serde(untagged)]
enum U128 {
Number(u64),
String(String),
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<u128, D::Error>
where
D: Deserializer<'de>,
{
match U128::deserialize(deserializer)? {
U128::Number(value) => Ok(u128::from(value)),
U128::String(value) => u128::from_str_radix(&value, 10).map_err(de::Error::custom),
}
}
}