mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
aquatic_ws: add serialization for 20-byte structures
This commit is contained in:
parent
9030944c02
commit
7155f493d9
2 changed files with 35 additions and 6 deletions
|
|
@ -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]
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)]
|
||||
Loading…
Add table
Add a link
Reference in a new issue