Skip to content

Commit

Permalink
Merge pull request #5 from ninegua/master
Browse files Browse the repository at this point in the history
Proper support for newtype and variants
  • Loading branch information
cfsamson authored Feb 3, 2021
2 parents 8f60b3d + 861c924 commit e29e8ab
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
14 changes: 12 additions & 2 deletions src/serializer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,11 @@ impl<S: Serializer> Serializer for ByteFmtSerializer<S> {
where
T: Serialize,
{
S::serialize_newtype_struct(self.inner, name, value)
S::serialize_newtype_struct(
self.inner,
name,
&BytesSerialize::new(value, self.encode_kind.clone()),
)
}

fn serialize_newtype_variant<T: ?Sized>(
Expand All @@ -137,7 +141,13 @@ impl<S: Serializer> Serializer for ByteFmtSerializer<S> {
where
T: Serialize,
{
S::serialize_newtype_variant(self.inner, name, variant_index, variant, value)
S::serialize_newtype_variant(
self.inner,
name,
variant_index,
variant,
&BytesSerialize::new(value, self.encode_kind.clone()),
)
}

fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
Expand Down
58 changes: 58 additions & 0 deletions tests/serialize.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,43 @@
use serde::{Deserialize, Serialize};
use serde_bytes_repr::ByteFmtSerializer;

#[test]
fn serialize_newtype_base64() {
#[derive(Serialize, Deserialize)]
struct Demo(#[serde(with = "serde_bytes")] Vec<u8>);
let bytes = b"testing".to_vec();
let demo = Demo(bytes);

let mut out = vec![];
let mut ser = serde_json::Serializer::new(&mut out);
let base64_config = base64::Config::new(base64::CharacterSet::UrlSafe, true);
let ser = ByteFmtSerializer::base64(&mut ser, base64_config);
demo.serialize(ser).unwrap();

let serialized = String::from_utf8(out).unwrap();
assert_eq!(r#""dGVzdGluZw==""#, serialized.as_str());
}

#[test]
fn serialize_newtype_variant_base64() {
#[derive(Serialize, Deserialize)]
enum Demo {
#[serde(with = "serde_bytes")]
N(Vec<u8>),
};
let bytes = b"testing".to_vec();
let demo = Demo::N(bytes);

let mut out = vec![];
let mut ser = serde_json::Serializer::new(&mut out);
let base64_config = base64::Config::new(base64::CharacterSet::UrlSafe, true);
let ser = ByteFmtSerializer::base64(&mut ser, base64_config);
demo.serialize(ser).unwrap();

let serialized = String::from_utf8(out).unwrap();
assert_eq!(r#"{"N":"dGVzdGluZw=="}"#, serialized.as_str());
}

#[test]
fn serialize_struct_base64() {
#[derive(Serialize, Deserialize)]
Expand All @@ -21,6 +58,27 @@ fn serialize_struct_base64() {
assert_eq!(r#"{"bytes":"dGVzdGluZw=="}"#, serialized.as_str());
}

#[test]
fn serialize_struct_variant_base64() {
#[derive(Serialize, Deserialize)]
enum Demo {
A(Vec<u8>),
#[serde(with = "serde_bytes")]
B(Vec<u8>),
}
let bytes = b"testing".to_vec();
let demo = Demo::B(bytes);

let mut out = vec![];
let mut ser = serde_json::Serializer::new(&mut out);
let base64_config = base64::Config::new(base64::CharacterSet::UrlSafe, true);
let ser = ByteFmtSerializer::base64(&mut ser, base64_config);
demo.serialize(ser).unwrap();

let serialized = String::from_utf8(out).unwrap();
assert_eq!(r#"{"B":"dGVzdGluZw=="}"#, serialized.as_str());
}

#[test]
fn serialize_seq_base64() {
let bytes = b"testing".to_vec();
Expand Down

0 comments on commit e29e8ab

Please sign in to comment.