mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 18:55:32 +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 hashbrown::HashMap;
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
pub mod deserialize;
|
mod serde_helpers;
|
||||||
|
|
||||||
use deserialize::*;
|
use serde_helpers::*;
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct PeerId(
|
pub struct PeerId(
|
||||||
#[serde(deserialize_with = "deserialize_20_bytes")]
|
#[serde(
|
||||||
|
deserialize_with = "deserialize_20_bytes",
|
||||||
|
serialize_with = "serialize_20_bytes"
|
||||||
|
)]
|
||||||
pub [u8; 20]
|
pub [u8; 20]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -17,7 +20,10 @@ pub struct PeerId(
|
||||||
#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct InfoHash(
|
pub struct InfoHash(
|
||||||
#[serde(deserialize_with = "deserialize_20_bytes")]
|
#[serde(
|
||||||
|
deserialize_with = "deserialize_20_bytes",
|
||||||
|
serialize_with = "serialize_20_bytes"
|
||||||
|
)]
|
||||||
pub [u8; 20]
|
pub [u8; 20]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -25,7 +31,10 @@ pub struct InfoHash(
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct OfferId(
|
pub struct OfferId(
|
||||||
#[serde(deserialize_with = "deserialize_20_bytes")]
|
#[serde(
|
||||||
|
deserialize_with = "deserialize_20_bytes",
|
||||||
|
serialize_with = "serialize_20_bytes"
|
||||||
|
)]
|
||||||
pub [u8; 20]
|
pub [u8; 20]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,18 @@
|
||||||
use serde::{Deserializer, de::{Visitor, SeqAccess}};
|
use serde::{Serializer, Deserializer, de::{Visitor, SeqAccess}};
|
||||||
|
|
||||||
use super::InfoHash;
|
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;
|
struct TwentyByteVisitor;
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for TwentyByteVisitor {
|
impl<'de> Visitor<'de> for TwentyByteVisitor {
|
||||||
|
|
@ -145,6 +155,16 @@ mod tests {
|
||||||
assert!(res_info_hash.is_err());
|
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)]
|
#[derive(Debug, PartialEq, Eq, Deserialize)]
|
||||||
struct Test {
|
struct Test {
|
||||||
#[serde(deserialize_with = "deserialize_info_hashes", default)]
|
#[serde(deserialize_with = "deserialize_info_hashes", default)]
|
||||||
Loading…
Add table
Add a link
Reference in a new issue