aboutsummaryrefslogtreecommitdiff
path: root/src/primitive
diff options
context:
space:
mode:
authorTobias Deiminger <tdmg@linutronix.de>2024-04-15 18:14:14 +0200
committerMax Audron <audron@cocaine.farm>2025-02-25 00:09:27 +0100
commit834dcc6319d3fbb9b0ed92a6b27b251ceb6127d7 (patch)
treeeb084373e73a138e86742f9118e473c1167501e6 /src/primitive
parentAdd MsgId as Rust type (diff)
Use MsgId in Variant
Diffstat (limited to 'src/primitive')
-rw-r--r--src/primitive/msgid.rs8
-rw-r--r--src/primitive/variant.rs49
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()
+ );
+ }
}