From 1bed4eb5a3727e84bac4d64995df212a971f4566 Mon Sep 17 00:00:00 2001 From: Max Audron Date: Wed, 26 Feb 2025 18:23:55 +0100 Subject: refactor deserialize and serializevariant trait move stuff around a bit to sepperate it out for deserializevariant --- src/deserialize.rs | 21 -------------- src/lib.rs | 5 +--- src/message/handshake/connack.rs | 2 +- src/message/handshake/init.rs | 2 +- src/message/handshake/protocol.rs | 2 +- src/message/handshake/types.rs | 2 +- src/message/signalproxy/heartbeat.rs | 2 +- src/message/signalproxy/initdata.rs | 2 +- src/message/signalproxy/initrequest.rs | 2 +- src/message/signalproxy/mod.rs | 2 +- src/message/signalproxy/rpccall.rs | 2 +- src/message/signalproxy/syncmessage.rs | 2 +- src/primitive/bufferid.rs | 2 +- src/primitive/bufferinfo.rs | 2 +- src/primitive/datetime.rs | 10 +++---- src/primitive/message.rs | 2 +- src/primitive/msgid.rs | 2 +- src/primitive/peerptr.rs | 2 +- src/primitive/signedint.rs | 12 ++++---- src/primitive/string.rs | 8 +++--- src/primitive/stringlist.rs | 6 ++-- src/primitive/unsignedint.rs | 14 +++++----- src/primitive/variant.rs | 2 +- src/primitive/variantlist.rs | 6 ++-- src/primitive/variantmap.rs | 6 ++-- src/serialize.rs | 50 ++++++++++++++++++++++------------ 26 files changed, 80 insertions(+), 90 deletions(-) delete mode 100644 src/deserialize.rs (limited to 'src') diff --git a/src/deserialize.rs b/src/deserialize.rs deleted file mode 100644 index e13f21f..0000000 --- a/src/deserialize.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::error::ProtocolError; - -/// Deserialization of types and structs to the quassel byteprotocol -pub trait Deserialize { - fn parse(b: &[u8]) -> Result<(usize, Self), ProtocolError> - where - Self: std::marker::Sized; -} - -/// Deserialization of UTF-8 based Strings to the quassel byteprotocol -pub trait DeserializeUTF8 { - fn parse_utf8(b: &[u8]) -> Result<(usize, Self), ProtocolError> - where - Self: std::marker::Sized; -} - -pub trait DeserializeVariant { - fn parse_variant(b: &[u8]) -> Result<(usize, Self), ProtocolError> - where - Self: std::marker::Sized; -} diff --git a/src/lib.rs b/src/lib.rs index a2daaa3..59581ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,12 +32,9 @@ compile_error!("feature \"client\" and feature \"server\" cannot be enabled at t pub use crate::error::ProtocolError; -/// Traits for Serialization of objects +/// Traits for Serialization & Deserialization of objects pub mod serialize; -/// Traits for parsing objects -pub mod deserialize; - /// HandshakeSerialize implements the serialization needed during the handhake phase. /// /// The protocol has some minor differences during this phase compared to the regular parsing. diff --git a/src/message/handshake/connack.rs b/src/message/handshake/connack.rs index bed0cb5..d325cb9 100644 --- a/src/message/handshake/connack.rs +++ b/src/message/handshake/connack.rs @@ -41,7 +41,7 @@ impl crate::serialize::Serialize for ConnAck { } } -impl crate::deserialize::Deserialize for ConnAck { +impl crate::serialize::Deserialize for ConnAck { fn parse(b: &[u8]) -> Result<(usize, Self), ProtocolError> { let (flen, flags) = u8::parse(b)?; let (elen, extra) = i16::parse(&b[flen..])?; diff --git a/src/message/handshake/init.rs b/src/message/handshake/init.rs index 51514ff..9f011ed 100644 --- a/src/message/handshake/init.rs +++ b/src/message/handshake/init.rs @@ -1,4 +1,4 @@ -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; /// The first few bytes sent to the core to initialize the connection and setup if we want to use tls and compression #[derive(Clone, Debug)] diff --git a/src/message/handshake/protocol.rs b/src/message/handshake/protocol.rs index c12da05..73a82b9 100644 --- a/src/message/handshake/protocol.rs +++ b/src/message/handshake/protocol.rs @@ -1,4 +1,4 @@ -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; pub enum Protocol { Legacy = 0x00000001, diff --git a/src/message/handshake/types.rs b/src/message/handshake/types.rs index fd8c8fa..bebeb4c 100644 --- a/src/message/handshake/types.rs +++ b/src/message/handshake/types.rs @@ -3,8 +3,8 @@ use std::vec::Vec; use crate::error::ProtocolError; use crate::primitive::Variant; +use crate::serialize::{Deserialize, Serialize}; use crate::util; -use crate::{deserialize::Deserialize, serialize::Serialize}; use crate::message::handshake::{HandshakeDeserialize, HandshakeSerialize}; use crate::primitive::VariantMap; diff --git a/src/message/signalproxy/heartbeat.rs b/src/message/signalproxy/heartbeat.rs index 32df3d4..9c952e5 100644 --- a/src/message/signalproxy/heartbeat.rs +++ b/src/message/signalproxy/heartbeat.rs @@ -1,7 +1,7 @@ use crate::error::ProtocolError; use crate::message::MessageType; use crate::primitive::{DateTime, Variant, VariantList}; -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; #[derive(Clone, Debug, std::cmp::PartialEq)] pub struct HeartBeat { diff --git a/src/message/signalproxy/initdata.rs b/src/message/signalproxy/initdata.rs index 2b9fa18..efdd8d7 100644 --- a/src/message/signalproxy/initdata.rs +++ b/src/message/signalproxy/initdata.rs @@ -1,7 +1,7 @@ use crate::error::ProtocolError; use crate::message::MessageType; use crate::primitive::{Variant, VariantList}; -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; use super::objects::Types; diff --git a/src/message/signalproxy/initrequest.rs b/src/message/signalproxy/initrequest.rs index 79b6cbc..1990dba 100644 --- a/src/message/signalproxy/initrequest.rs +++ b/src/message/signalproxy/initrequest.rs @@ -1,7 +1,7 @@ use crate::error::ProtocolError; use crate::message::MessageType; use crate::primitive::{Variant, VariantList}; -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; #[derive(Clone, Debug, std::cmp::PartialEq)] pub struct InitRequest { diff --git a/src/message/signalproxy/mod.rs b/src/message/signalproxy/mod.rs index 5801846..6cd887b 100644 --- a/src/message/signalproxy/mod.rs +++ b/src/message/signalproxy/mod.rs @@ -1,7 +1,7 @@ use crate::{ - deserialize::Deserialize, error::ProtocolError, primitive::{Variant, VariantList}, + serialize::Deserialize, serialize::Serialize, }; diff --git a/src/message/signalproxy/rpccall.rs b/src/message/signalproxy/rpccall.rs index 04c75cb..833fad9 100644 --- a/src/message/signalproxy/rpccall.rs +++ b/src/message/signalproxy/rpccall.rs @@ -2,7 +2,7 @@ use crate::error::ProtocolError; use crate::message::MessageType; use crate::primitive::Message; use crate::primitive::{Variant, VariantList}; -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; #[derive(Clone, Debug, std::cmp::PartialEq)] pub enum RpcCall { diff --git a/src/message/signalproxy/syncmessage.rs b/src/message/signalproxy/syncmessage.rs index b1123ac..94930af 100644 --- a/src/message/signalproxy/syncmessage.rs +++ b/src/message/signalproxy/syncmessage.rs @@ -1,7 +1,7 @@ use crate::error::ProtocolError; use crate::message::MessageType; use crate::primitive::{Variant, VariantList}; -use crate::{deserialize::Deserialize, serialize::Serialize}; +use crate::serialize::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] pub enum Class { diff --git a/src/primitive/bufferid.rs b/src/primitive/bufferid.rs index 1735473..844dd37 100644 --- a/src/primitive/bufferid.rs +++ b/src/primitive/bufferid.rs @@ -2,7 +2,7 @@ #[repr(transparent)] pub struct BufferId(pub i32); -use crate::{deserialize::*, error::ProtocolError, serialize::*}; +use crate::{error::ProtocolError, serialize::*}; use crate::serialize::UserType; diff --git a/src/primitive/bufferinfo.rs b/src/primitive/bufferinfo.rs index f2f13bf..56d5cce 100644 --- a/src/primitive/bufferinfo.rs +++ b/src/primitive/bufferinfo.rs @@ -1,7 +1,7 @@ use std::vec::Vec; use crate::primitive::BufferId; -use crate::{deserialize::*, error::ProtocolError, serialize::*}; +use crate::{error::ProtocolError, serialize::*}; use crate::serialize::UserType; diff --git a/src/primitive/datetime.rs b/src/primitive/datetime.rs index 2159af3..42f6d14 100644 --- a/src/primitive/datetime.rs +++ b/src/primitive/datetime.rs @@ -1,4 +1,4 @@ -use crate::{deserialize::*, error::ProtocolError, primitive, serialize::*}; +use crate::{error::ProtocolError, primitive, serialize::*}; use time::{OffsetDateTime, PrimitiveDateTime, UtcOffset}; @@ -18,7 +18,7 @@ use time::{OffsetDateTime, PrimitiveDateTime, UtcOffset}; pub type DateTime = OffsetDateTime; pub use time::{Date, Time}; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; /// TimeSpec specifies whether the time is a local time, daylightsaving local time or a form of UTC Offset #[repr(i8)] @@ -113,7 +113,7 @@ impl Deserialize for OffsetDateTime { } } -impl SerializeVariant for OffsetDateTime { +impl VariantType for OffsetDateTime { const TYPE: u32 = primitive::QDATETIME; } @@ -136,7 +136,7 @@ impl Deserialize for Date { } } -impl SerializeVariant for Date { +impl VariantType for Date { const TYPE: u32 = primitive::QDATE; } @@ -174,7 +174,7 @@ impl Deserialize for Time { } } -impl SerializeVariant for Time { +impl VariantType for Time { const TYPE: u32 = primitive::QTIME; } diff --git a/src/primitive/message.rs b/src/primitive/message.rs index bac3899..624ff49 100644 --- a/src/primitive/message.rs +++ b/src/primitive/message.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, vec::Vec}; use crate::error::ProtocolError; -use crate::{deserialize::*, serialize::*}; +use crate::serialize::*; use crate::primitive::{BufferInfo, MsgId}; diff --git a/src/primitive/msgid.rs b/src/primitive/msgid.rs index 7f3e32f..9ae8d9c 100644 --- a/src/primitive/msgid.rs +++ b/src/primitive/msgid.rs @@ -6,7 +6,7 @@ pub struct MsgId( ); use crate::error::ProtocolError; -use crate::{deserialize::*, serialize::*}; +use crate::serialize::*; use crate::serialize::UserType; diff --git a/src/primitive/peerptr.rs b/src/primitive/peerptr.rs index f2a3e05..499be41 100644 --- a/src/primitive/peerptr.rs +++ b/src/primitive/peerptr.rs @@ -1,5 +1,5 @@ use crate::{ - deserialize::Deserialize, + serialize::Deserialize, serialize::{Serialize, SerializeUTF8}, }; diff --git a/src/primitive/signedint.rs b/src/primitive/signedint.rs index d8361a3..6bf009f 100644 --- a/src/primitive/signedint.rs +++ b/src/primitive/signedint.rs @@ -4,9 +4,9 @@ use std::io::Cursor; use std::result::Result; use std::vec::Vec; -use crate::{deserialize::*, error::ProtocolError, primitive, serialize::*}; +use crate::{error::ProtocolError, primitive, serialize::*}; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; impl Serialize for i64 { fn serialize(&self) -> Result, ProtocolError> { @@ -21,7 +21,7 @@ impl Deserialize for i64 { } } -impl SerializeVariant for i64 { +impl VariantType for i64 { const TYPE: u32 = primitive::LONG; } @@ -38,7 +38,7 @@ impl Deserialize for i32 { } } -impl SerializeVariant for i32 { +impl VariantType for i32 { const TYPE: u32 = primitive::INT; } @@ -55,7 +55,7 @@ impl Deserialize for i16 { } } -impl SerializeVariant for i16 { +impl VariantType for i16 { const TYPE: u32 = primitive::SHORT; } @@ -72,6 +72,6 @@ impl Deserialize for i8 { } } -impl SerializeVariant for i8 { +impl VariantType for i8 { const TYPE: u32 = primitive::CHAR; } diff --git a/src/primitive/string.rs b/src/primitive/string.rs index 1d6f0af..7f8ec58 100644 --- a/src/primitive/string.rs +++ b/src/primitive/string.rs @@ -5,9 +5,9 @@ use std::vec::Vec; use log::trace; -use crate::{deserialize::*, error::ProtocolError, primitive, serialize::*, util}; +use crate::{error::ProtocolError, primitive, serialize::*, util}; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; impl Deserialize for char { fn parse(b: &[u8]) -> Result<(usize, Self), ProtocolError> { @@ -27,7 +27,7 @@ impl Serialize for char { } } -impl SerializeVariant for char { +impl VariantType for char { const TYPE: u32 = crate::primitive::QCHAR; } @@ -46,7 +46,7 @@ impl SerializeUTF8 for String { } } -impl SerializeVariant for String { +impl VariantType for String { const TYPE: u32 = primitive::QSTRING; } diff --git a/src/primitive/stringlist.rs b/src/primitive/stringlist.rs index f76e95d..292557f 100644 --- a/src/primitive/stringlist.rs +++ b/src/primitive/stringlist.rs @@ -5,9 +5,9 @@ use std::vec::Vec; use log::trace; -use crate::{deserialize::*, error::ProtocolError, serialize::*}; +use crate::{error::ProtocolError, serialize::*}; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; /// StringList are represented as a Vec of Strings /// @@ -47,7 +47,7 @@ impl Deserialize for StringList { } } -impl SerializeVariant for StringList { +impl VariantType for StringList { const TYPE: u32 = crate::primitive::QSTRINGLIST; } diff --git a/src/primitive/unsignedint.rs b/src/primitive/unsignedint.rs index f0a78f7..a51ca6f 100644 --- a/src/primitive/unsignedint.rs +++ b/src/primitive/unsignedint.rs @@ -6,9 +6,9 @@ use std::result::Result; use std::vec::Vec; use crate::error::ProtocolError; -use crate::{deserialize::*, primitive, serialize::*}; +use crate::{primitive, serialize::*}; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; impl Serialize for bool { fn serialize(&self) -> Result, ProtocolError> { @@ -31,7 +31,7 @@ impl Deserialize for bool { } } -impl SerializeVariant for bool { +impl VariantType for bool { const TYPE: u32 = primitive::BOOL; } @@ -48,7 +48,7 @@ impl Deserialize for u64 { } } -impl SerializeVariant for u64 { +impl VariantType for u64 { const TYPE: u32 = primitive::ULONG; } @@ -65,7 +65,7 @@ impl Deserialize for u32 { } } -impl SerializeVariant for u32 { +impl VariantType for u32 { const TYPE: u32 = primitive::UINT; } @@ -82,7 +82,7 @@ impl Deserialize for u16 { } } -impl SerializeVariant for u16 { +impl VariantType for u16 { const TYPE: u32 = primitive::USHORT; } @@ -98,6 +98,6 @@ impl Deserialize for u8 { } } -impl SerializeVariant for u8 { +impl VariantType for u8 { const TYPE: u32 = primitive::UCHAR; } diff --git a/src/primitive/variant.rs b/src/primitive/variant.rs index 3678ca7..32757d9 100644 --- a/src/primitive/variant.rs +++ b/src/primitive/variant.rs @@ -6,7 +6,7 @@ use log::{error, trace}; use crate::error::ProtocolError; use crate::primitive::StringList; use crate::primitive::{self, PeerPtr}; -use crate::{deserialize::*, serialize::*}; +use crate::serialize::*; use crate::primitive::{BufferId, BufferInfo, Date, DateTime, Message, MsgId, Time, VariantList, VariantMap}; diff --git a/src/primitive/variantlist.rs b/src/primitive/variantlist.rs index ac8cc07..0f0f4e0 100644 --- a/src/primitive/variantlist.rs +++ b/src/primitive/variantlist.rs @@ -3,11 +3,11 @@ use std::vec::Vec; use log::trace; use crate::error::ProtocolError; -use crate::{deserialize::*, serialize::*}; +use crate::serialize::*; use crate::primitive::Variant; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; /// VariantLists are represented as a Vec of Variants. /// @@ -47,7 +47,7 @@ impl Deserialize for VariantList { } } -impl SerializeVariant for VariantList { +impl VariantType for VariantList { const TYPE: u32 = crate::primitive::QVARIANTLIST; } diff --git a/src/primitive/variantmap.rs b/src/primitive/variantmap.rs index 7a847c5..4953f25 100644 --- a/src/primitive/variantmap.rs +++ b/src/primitive/variantmap.rs @@ -4,12 +4,12 @@ use std::vec::Vec; use log::trace; use crate::error::ProtocolError; -use crate::{deserialize::*, serialize::*}; +use crate::serialize::*; use crate::primitive::Variant; use crate::util; -use crate::serialize::SerializeVariant; +use crate::serialize::VariantType; /// VariantMaps are represented as a HashMap with String as key and Variant as value /// @@ -55,6 +55,6 @@ impl Deserialize for VariantMap { } } -impl SerializeVariant for VariantMap { +impl VariantType for VariantMap { const TYPE: u32 = crate::primitive::QVARIANTMAP; } diff --git a/src/serialize.rs b/src/serialize.rs index 52fc2fe..553a239 100644 --- a/src/serialize.rs +++ b/src/serialize.rs @@ -46,36 +46,24 @@ pub trait UserType { /// const TYPE: u32 = primitive::QVARIANTLIST; /// } /// ``` -pub trait SerializeVariant { +pub trait VariantType { /// QT Type as defined by the [Primitive Constants] /// /// [Primitive Constants]: primitive#constants const TYPE: u32; +} +pub trait SerializeVariant: VariantType + Serialize { /// Default implementation that passes the serialization through to [SerializeVariantInner]. /// [SerializeVariantInner] is automaticly implemented for all types that implement [Serialize] /// /// ```rust ignore /// self.serialize_variant_inner(Self::TYPE) /// ``` - fn serialize_variant(&self) -> Result, ProtocolError> - where - Self: SerializeVariantInner, - { - self.serialize_variant_inner(Self::TYPE) - } -} - -/// Implemented automaticly for all types that implement [Serialize] refer to [SerializeVariant] -pub trait SerializeVariantInner { - fn serialize_variant_inner(&self, t: u32) -> Result, ProtocolError>; -} - -impl SerializeVariantInner for T { - fn serialize_variant_inner(&self, t: u32) -> Result, ProtocolError> { + fn serialize_variant(&self) -> Result, ProtocolError> { let mut res: Vec = Vec::new(); - res.extend(t.to_be_bytes().iter()); + res.extend(Self::TYPE.to_be_bytes().iter()); res.extend(0x00u8.to_be_bytes().iter()); res.extend(self.serialize()?); @@ -83,6 +71,32 @@ impl SerializeVariantInner for T { } } -impl SerializeVariant for T { +impl SerializeVariant for T {} + +impl VariantType for T { const TYPE: u32 = primitive::USERTYPE; } + +// ============================================= +// Deserialization +// + +/// Deserialization of types and structs to the quassel byteprotocol +pub trait Deserialize { + fn parse(b: &[u8]) -> Result<(usize, Self), ProtocolError> + where + Self: std::marker::Sized; +} + +/// Deserialization of UTF-8 based Strings to the quassel byteprotocol +pub trait DeserializeUTF8 { + fn parse_utf8(b: &[u8]) -> Result<(usize, Self), ProtocolError> + where + Self: std::marker::Sized; +} + +pub trait DeserializeVariant: VariantType { + fn parse_variant(b: &[u8]) -> Result<(usize, Self), ProtocolError> + where + Self: std::marker::Sized; +} -- cgit v1.2.3