diff --git a/aquatic_ws/src/lib/protocol/mod.rs b/aquatic_ws/src/lib/protocol/mod.rs index fce47a1..46ce9d8 100644 --- a/aquatic_ws/src/lib/protocol/mod.rs +++ b/aquatic_ws/src/lib/protocol/mod.rs @@ -1,15 +1,18 @@ use hashbrown::HashMap; use serde::{Serialize, Deserialize}; -pub mod deserialize; +mod serde_helpers; -use deserialize::*; +use serde_helpers::*; #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] #[serde(transparent)] pub struct PeerId( - #[serde(deserialize_with = "deserialize_20_bytes")] + #[serde( + deserialize_with = "deserialize_20_bytes", + serialize_with = "serialize_20_bytes" + )] pub [u8; 20] ); @@ -17,7 +20,10 @@ pub struct PeerId( #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] #[serde(transparent)] pub struct InfoHash( - #[serde(deserialize_with = "deserialize_20_bytes")] + #[serde( + deserialize_with = "deserialize_20_bytes", + serialize_with = "serialize_20_bytes" + )] pub [u8; 20] ); @@ -25,7 +31,10 @@ pub struct InfoHash( #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(transparent)] pub struct OfferId( - #[serde(deserialize_with = "deserialize_20_bytes")] + #[serde( + deserialize_with = "deserialize_20_bytes", + serialize_with = "serialize_20_bytes" + )] pub [u8; 20] ); diff --git a/aquatic_ws/src/lib/protocol/deserialize.rs b/aquatic_ws/src/lib/protocol/serde_helpers.rs similarity index 90% rename from aquatic_ws/src/lib/protocol/deserialize.rs rename to aquatic_ws/src/lib/protocol/serde_helpers.rs index 347ca1b..6a4f7a2 100644 --- a/aquatic_ws/src/lib/protocol/deserialize.rs +++ b/aquatic_ws/src/lib/protocol/serde_helpers.rs @@ -1,8 +1,18 @@ -use serde::{Deserializer, de::{Visitor, SeqAccess}}; +use serde::{Serializer, Deserializer, de::{Visitor, SeqAccess}}; use super::InfoHash; +pub fn serialize_20_bytes( + data: &[u8; 20], + serializer: S +) -> Result where S: Serializer { + let text: String = data.iter().map(|byte| *byte as char).collect(); + + serializer.serialize_str(&text) +} + + struct TwentyByteVisitor; impl<'de> Visitor<'de> for TwentyByteVisitor { @@ -145,6 +155,16 @@ mod tests { assert!(res_info_hash.is_err()); } + #[test] + fn test_serde_20_bytes(){ + let info_hash = info_hash_from_bytes(b"aaaabbbbccccddddeeee"); + + let out = serde_json::to_string(&info_hash).unwrap(); + let info_hash_2 = serde_json::from_str(&out).unwrap(); + + assert_eq!(info_hash, info_hash_2); + } + #[derive(Debug, PartialEq, Eq, Deserialize)] struct Test { #[serde(deserialize_with = "deserialize_info_hashes", default)]