From 3090f1f5bbd08334cdd02875293ad8cc70b49e52 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Sat, 10 Jul 2021 00:00:40 +0100 Subject: [PATCH] Relax bencode value constraints --- crates/bencode/src/bencode_value.rs | 46 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/crates/bencode/src/bencode_value.rs b/crates/bencode/src/bencode_value.rs index 9904d3e..f8458d8 100644 --- a/crates/bencode/src/bencode_value.rs +++ b/crates/bencode/src/bencode_value.rs @@ -2,18 +2,18 @@ use std::{collections::HashMap, marker::PhantomData}; use buffers::{ByteBuf, ByteString}; use clone_to_owned::CloneToOwned; -use serde::{Deserialize, Deserializer}; +use serde::Deserializer; use crate::serde_bencode_de::from_bytes; -pub fn dyn_from_bytes<'de, ByteBuf>(buf: &'de [u8]) -> anyhow::Result> +pub fn dyn_from_bytes<'de, BufT>(buf: &'de [u8]) -> anyhow::Result> where - ByteBuf: From<&'de [u8]> + Deserialize<'de> + std::hash::Hash + Eq, + BufT: From<&'de [u8]> + std::hash::Hash + Eq, { from_bytes(buf) } -impl serde::Serialize for BencodeValue { +impl serde::Serialize for BencodeValue { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, @@ -27,23 +27,23 @@ impl serde::Serialize for Benc } } -impl<'de, ByteBuf> serde::de::Deserialize<'de> for BencodeValue +impl<'de, BufT> serde::de::Deserialize<'de> for BencodeValue where - ByteBuf: From<&'de [u8]> + Deserialize<'de> + std::hash::Hash + Eq, + BufT: From<&'de [u8]> + std::hash::Hash + Eq, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - struct Visitor { - buftype: PhantomData, + struct Visitor { + buftype: PhantomData, } - impl<'de, ByteBuf> serde::de::Visitor<'de> for Visitor + impl<'de, BufT> serde::de::Visitor<'de> for Visitor where - ByteBuf: From<&'de [u8]> + Deserialize<'de> + std::hash::Hash + Eq, + BufT: From<&'de [u8]> + std::hash::Hash + Eq, { - type Value = BencodeValue; + type Value = BencodeValue; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { write!(formatter, "a bencode value") @@ -71,7 +71,7 @@ where where E: serde::de::Error, { - Ok(BencodeValue::Bytes(ByteBuf::from(v))) + Ok(BencodeValue::Bytes(BufT::from(v))) } fn visit_map(self, mut map: A) -> Result @@ -79,9 +79,9 @@ where A: serde::de::MapAccess<'de>, { let mut hmap = HashMap::new(); - while let Some(key) = map.next_key()? { + while let Some(key) = map.next_key::<&'de [u8]>()? { let value = map.next_value()?; - hmap.insert(key, value); + hmap.insert(BufT::from(key), value); } Ok(BencodeValue::Dict(hmap)) } @@ -97,14 +97,14 @@ where // Useful for debugging. #[derive(PartialEq, Eq)] -pub enum BencodeValue { - Bytes(ByteBuf), +pub enum BencodeValue { + Bytes(BufT), Integer(i64), - List(Vec>), - Dict(HashMap>), + List(Vec>), + Dict(HashMap>), } -impl std::fmt::Debug for BencodeValue { +impl std::fmt::Debug for BencodeValue { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { BencodeValue::Bytes(b) => std::fmt::Debug::fmt(b, f), @@ -115,12 +115,12 @@ impl std::fmt::Debug for Bencod } } -impl CloneToOwned for BencodeValue +impl CloneToOwned for BencodeValue where - ByteBuf: CloneToOwned + std::hash::Hash + Eq, - ::Target: Eq + std::hash::Hash, + BufT: CloneToOwned + std::hash::Hash + Eq, + ::Target: Eq + std::hash::Hash, { - type Target = BencodeValue<::Target>; + type Target = BencodeValue<::Target>; fn clone_to_owned(&self) -> Self::Target { match self {