use crate::WireError;
use crate::codec::{WireDecode, WireEncode, read_u64_le, read_u128_le};
use bytes::{BufMut, BytesMut};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AttachConsumerSessionRequest {
pub client_id: u128,
pub session: u64,
pub metadata_watermark: u64,
}
impl WireEncode for AttachConsumerSessionRequest {
fn encoded_size(&self) -> usize {
32
}
fn encode(&self, buf: &mut BytesMut) {
buf.put_u128_le(self.client_id);
buf.put_u64_le(self.session);
buf.put_u64_le(self.metadata_watermark);
}
}
impl WireDecode for AttachConsumerSessionRequest {
fn decode(buf: &[u8]) -> Result<(Self, usize), WireError> {
Ok((
Self {
client_id: read_u128_le(buf, 0)?,
session: read_u64_le(buf, 16)?,
metadata_watermark: read_u64_le(buf, 24)?,
},
32,
))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn roundtrip_and_reject_truncation() {
let request = AttachConsumerSessionRequest {
client_id: u128::MAX,
session: 7,
metadata_watermark: 11,
};
let bytes = request.to_bytes();
assert_eq!(
AttachConsumerSessionRequest::decode(&bytes).unwrap(),
(request, bytes.len())
);
for end in 0..bytes.len() {
assert!(
AttachConsumerSessionRequest::decode(&bytes[..end]).is_err(),
"accepted truncation at {end}"
);
}
}
}