diff options
| author | Tobias Deiminger <tdmg@linutronix.de> | 2024-04-15 18:14:14 +0200 |
|---|---|---|
| committer | Max Audron <audron@cocaine.farm> | 2025-02-25 00:09:27 +0100 |
| commit | 834dcc6319d3fbb9b0ed92a6b27b251ceb6127d7 (patch) | |
| tree | eb084373e73a138e86742f9118e473c1167501e6 /src/primitive | |
| parent | Add MsgId as Rust type (diff) | |
Use MsgId in Variant
Diffstat (limited to 'src/primitive')
| -rw-r--r-- | src/primitive/msgid.rs | 8 | ||||
| -rw-r--r-- | src/primitive/variant.rs | 49 |
2 files changed, 37 insertions, 20 deletions
diff --git a/src/primitive/msgid.rs b/src/primitive/msgid.rs index 509c1e7..a8048cf 100644 --- a/src/primitive/msgid.rs +++ b/src/primitive/msgid.rs @@ -4,19 +4,17 @@ pub struct MsgId( #[cfg(feature = "long-message-id")] pub i64, ); -use failure::Error; - -use crate::primitive::signedint; +use crate::error::ProtocolError; use crate::{deserialize::*, serialize::*}; impl Serialize for MsgId { - fn serialize(&self) -> Result<Vec<u8>, Error> { + fn serialize(&self) -> Result<Vec<u8>, ProtocolError> { self.0.serialize() } } impl Deserialize for MsgId { - fn parse(b: &[u8]) -> Result<(usize, Self), Error> { + fn parse(b: &[u8]) -> Result<(usize, Self), ProtocolError> { #[cfg(not(feature = "long-message-id"))] let (size, value) = i32::parse(b)?; #[cfg(feature = "long-message-id")] diff --git a/src/primitive/variant.rs b/src/primitive/variant.rs index e84e5c0..22ac56a 100644 --- a/src/primitive/variant.rs +++ b/src/primitive/variant.rs @@ -8,7 +8,7 @@ use crate::primitive; use crate::primitive::StringList; use crate::{deserialize::*, serialize::*}; -use crate::primitive::{BufferInfo, Date, DateTime, Message, Time, VariantList, VariantMap}; +use crate::primitive::{BufferInfo, Date, DateTime, Message, MsgId, Time, VariantList, VariantMap}; use libquassel_derive::From; @@ -28,6 +28,7 @@ pub enum Variant { UserType(String, Vec<u8>), BufferInfo(BufferInfo), Message(Message), + MsgId(MsgId), Time(Time), Date(Date), DateTime(DateTime), @@ -253,6 +254,11 @@ impl Serialize for Variant { let user = Variant::UserType("Message".to_string(), bytes); Variant::serialize(&user).unwrap(); } + Variant::MsgId(v) => { + let bytes = MsgId::serialize(v)?; + let user = Variant::UserType("MsgId".to_string(), bytes); + return Variant::serialize(&user); + } Variant::DateTime(v) => { res.extend(primitive::QDATETIME.to_be_bytes().iter()); res.extend(unknown.to_be_bytes().iter()); @@ -389,20 +395,6 @@ impl Deserialize for Variant { let (vlen, value) = i32::parse(&b[(len + user_type_len)..])?; return Ok((len + user_type_len + vlen, Variant::i32(value))); } - #[cfg(not(feature = "long-message-id"))] - "MsgId" => { - trace!(target: "primitive::Variant", "UserType is i32"); - - let (vlen, value) = i32::parse(&b[(len + user_type_len)..])?; - return Ok((len + user_type_len + vlen, Variant::i32(value))); - } - #[cfg(feature = "long-message-id")] - "MsgId" => { - trace!(target: "primitive::Variant", "UserType is i64"); - - let (vlen, value) = i64::parse(&b[(len + user_type_len)..])?; - return Ok((len + user_type_len + vlen, Variant::i64(value))); - } // As i64 "PeerPtr" => { trace!(target: "primitive::Variant", "UserType is i64"); @@ -419,6 +411,11 @@ impl Deserialize for Variant { let (vlen, value) = Message::parse(&b[(len + user_type_len)..])?; return Ok((len + user_type_len + vlen, Variant::Message(value))); } + "MsgId" => { + trace!(target: "primitive::Variant", "UserType is MsgId"); + let (vlen, value) = MsgId::parse(&b[(len + user_type_len)..])?; + return Ok((len + user_type_len + vlen, Variant::MsgId(value))); + } _ => unimplemented!(), } } @@ -762,4 +759,26 @@ mod tests { Variant::parse(&[0, 0, 0, 0x0f, 0, 2, 202, 28, 128]).unwrap() ); } + + #[test] + fn msgid_serialize() { + let test_msg_id = Variant::MsgId(MsgId(1)); + + assert_eq!( + test_msg_id.serialize().unwrap(), + [0, 0, 0, 127, 0, 0, 0, 0, 5, 77, 115, 103, 73, 100, 0, 0, 0, 0, 0, 0, 0, 1] + ); + } + + #[test] + fn msgid_deserialize() { + let test_bytes = vec![ + 0, 0, 0, 127, 0, 0, 0, 0, 5, 77, 115, 103, 73, 100, 0, 0, 0, 0, 0, 0, 0, 1, + ]; + + assert_eq!( + (test_bytes.len(), Variant::MsgId(MsgId(1))), + Variant::parse(&test_bytes).unwrap() + ); + } } |
