serde_repr_base64 0.1.0

A #[serde(with = "base64")] adaptor for base64 and bytemuck.
Documentation
use std::fmt::Debug;

use serde::{de::DeserializeOwned, Deserialize, Serialize};
use serde_repr_base64::{base64, base64_if_readable, base64_string};

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct BytesTest {
    #[serde(with = "base64")]
    byte_array: [u8; 2],
    #[serde(with = "base64")]
    bytes: Vec<u8>,
    #[serde(with = "base64_if_readable")]
    byte_array2: [u8; 2],
    #[serde(with = "base64_if_readable")]
    bytes2: Vec<u8>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct NumbersTest {
    #[serde(with = "base64")]
    byte_array: [usize; 2],
    #[serde(with = "base64")]
    bytes: Vec<i64>,
    #[serde(with = "base64_if_readable")]
    byte_array2: [usize; 2],
    #[serde(with = "base64_if_readable")]
    bytes2: Vec<i64>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct StringTest {
    #[serde(with = "base64_string")]
    str: String,
}

fn assert_round_trips<A: PartialEq + Serialize + DeserializeOwned + Debug>(a: A) {
    let b = serde_json::to_string(&a).unwrap();
    let b: A = serde_json::from_str(&b).unwrap();
    assert_eq!(a, b);
    let c = postcard::to_allocvec(&a).unwrap();
    let c: A = postcard::from_bytes(&c).unwrap();
    assert_eq!(a, c);
}

#[test]
pub fn test() {
    assert_round_trips(StringTest {
        str: "Hello, World".into(),
    });
    assert_round_trips(BytesTest {
        byte_array: [123, 74],
        bytes: vec![1, 23, 14, 51, 125],
        byte_array2: [123, 12],
        bytes2: vec![123, 12, 84, 2],
    });
    assert_round_trips(NumbersTest {
        byte_array: [123, 74],
        bytes: vec![1, 23, 14, 51, 125],
        byte_array2: [123, 12],
        bytes2: vec![123, 12, 84, 2],
    });
}