aquatic_ws: add serialization for 20-byte structures

This commit is contained in:
Joakim Frostegård 2020-05-12 00:19:42 +02:00
parent 9030944c02
commit 7155f493d9
2 changed files with 35 additions and 6 deletions

View file

@ -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]
);

View file

@ -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<S>(
data: &[u8; 20],
serializer: S
) -> Result<S::Ok, S::Error> 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)]