#![allow(clippy::box_collection)] use base64::{engine::general_purpose::STANDARD, Engine}; use base64_serde::base64_serde_type; use std::cell::RefCell; base64_serde_type!(Base64Standard, STANDARD); mod some_other_mod { use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; base64_serde_type!(pub Base64StandardInModule, STANDARD); } #[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] struct ByteHolder { #[serde(with = "Base64Standard")] bytes: Vec, } #[derive(Debug, PartialEq, serde::Deserialize)] struct BoxVecHolder { #[serde(with = "Base64Standard")] bytes: Box>, } #[derive(Debug, PartialEq, serde::Deserialize)] struct RefCellVecHolder { #[serde(with = "Base64Standard")] bytes: RefCell>, } #[derive(Debug, PartialEq, serde::Serialize)] struct SliceHolder<'a> { #[serde(with = "Base64Standard")] bytes: &'a [u8], } #[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] struct ByteHolderHelperInMod { #[serde(with = "some_other_mod::Base64StandardInModule")] bytes: Vec, } #[test] fn serde_with_type() { let b = ByteHolder { bytes: vec![0x00, 0x77, 0xFF], }; let s = serde_json::to_string(&b).unwrap(); let expected = format!("{{\"bytes\":\"{}\"}}", STANDARD.encode(&b.bytes)); assert_eq!(expected, s); let b2 = serde_json::from_str(&s).unwrap(); assert_eq!(b, b2); } #[test] fn deserialize_with_box_vec() { let b = BoxVecHolder { bytes: Box::new(vec![0x00, 0x77, 0xFF]), }; let json = format!("{{\"bytes\":\"{}\"}}", STANDARD.encode(b.bytes.as_slice())); let b2 = serde_json::from_str(&json).unwrap(); assert_eq!(b, b2); } #[test] fn deserialize_with_refcell() { let b = RefCellVecHolder { bytes: RefCell::new(vec![0x00, 0x77, 0xFF]), }; let expected = format!( "{{\"bytes\":\"{}\"}}", STANDARD.encode(b.bytes.borrow().as_slice()) ); let b2 = serde_json::from_str(&expected).unwrap(); assert_eq!(b, b2); } #[test] fn serialize_with_u8_slice() { let bytes = vec![0x00, 0x77, 0xFF]; let b = SliceHolder { bytes: &bytes }; let s = serde_json::to_string(&b).unwrap(); let expected = format!("{{\"bytes\":\"{}\"}}", STANDARD.encode(b.bytes)); assert_eq!(expected, s); } #[test] fn serde_with_type_using_public_helper() { let b = ByteHolderHelperInMod { bytes: vec![0x00, 0x77, 0xFF], }; let s = serde_json::to_string(&b).unwrap(); let expected = format!("{{\"bytes\":\"{}\"}}", STANDARD.encode(&b.bytes)); assert_eq!(expected, s); let b2 = serde_json::from_str(&s).unwrap(); assert_eq!(b, b2); } #[test] fn fails_nicely_on_inappropriate_input() { assert_eq!( "invalid type: integer `1234`, expected base64 ASCII text at line 1 column 13", format!( "{}", serde_json::from_str::("{\"bytes\":1234}").unwrap_err() ) ); }