use crate::coding::*;
use super::{Message, Version};
#[derive(Clone, Debug)]
pub struct Group {
pub subscribe: u64,
pub sequence: u64,
pub frame_start: u64,
}
impl Message for Group {
fn decode_msg<R: bytes::Buf>(r: &mut R, version: Version) -> Result<Self, DecodeError> {
let subscribe = u64::decode(r, version)?;
let sequence = u64::decode(r, version)?;
let frame_start = match version.has_frame_bounds() {
true => u64::decode(r, version)?,
false => 0,
};
Ok(Self {
subscribe,
sequence,
frame_start,
})
}
fn encode_msg<W: bytes::BufMut>(&self, w: &mut W, version: Version) -> Result<(), EncodeError> {
self.subscribe.encode(w, version)?;
self.sequence.encode(w, version)?;
if version.has_frame_bounds() {
self.frame_start.encode(w, version)?;
} else if self.frame_start != 0 {
return Err(EncodeError::Version);
}
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn frame_start_roundtrips() {
let msg = Group {
subscribe: 1,
sequence: 7,
frame_start: 4,
};
let mut buf = Vec::new();
msg.encode_msg(&mut buf, Version::Lite06).unwrap();
let got = Group::decode_msg(&mut buf.as_slice(), Version::Lite06).unwrap();
assert_eq!((got.sequence, got.frame_start), (7, 4));
}
#[test]
fn frame_start_rejected_before_lite06() {
let msg = Group {
subscribe: 1,
sequence: 7,
frame_start: 4,
};
let mut buf = Vec::new();
assert!(msg.encode_msg(&mut buf, Version::Lite05).is_err());
let whole = Group { frame_start: 0, ..msg };
let mut buf = Vec::new();
whole.encode_msg(&mut buf, Version::Lite05).unwrap();
let got = Group::decode_msg(&mut buf.as_slice(), Version::Lite05).unwrap();
assert_eq!(got.frame_start, 0);
}
}