use super::*;
use bytes::{Buf, BufMut, Bytes, BytesMut};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResumeFrame {
version: Version,
resume_token: Bytes,
last_received_server_position: u64,
first_available_client_position: u64,
}
impl ResumeFrame {
pub const STREAM_ID: u32 = 0;
pub fn new(
version: Version,
resume_token: Bytes,
mut last_received_server_position: u64,
mut first_available_client_position: u64,
) -> Self {
debug_assert_max_u63!(
last_received_server_position,
first_available_client_position
);
last_received_server_position &= MAX_U63;
first_available_client_position &= MAX_U63;
ResumeFrame {
version,
resume_token,
last_received_server_position,
first_available_client_position,
}
}
pub fn version(&self) -> Version {
self.version
}
pub fn resume_token(&self) -> &Bytes {
&self.resume_token
}
pub fn last_received_server_position(&self) -> u64 {
self.last_received_server_position
}
pub fn first_available_client_position(&self) -> u64 {
self.first_available_client_position
}
}
impl Encode for ResumeFrame {
fn encode(&self, buf: &mut BytesMut) {
buf.put_u32(0);
buf.put_u16(FrameType::RESUME.bits());
self.version.encode(buf);
buf.put_u16(self.resume_token.len() as u16);
buf.put_slice(&self.resume_token);
buf.put_u64(self.last_received_server_position);
buf.put_u64(self.first_available_client_position);
}
fn len(&self) -> usize {
12 + self.resume_token.len() + 16
}
}
impl Decode for ResumeFrame {
type Value = Self;
fn decode<B: Buf>(
buf: &mut B,
_stream_id: u32,
_flags: Flags,
) -> Result<Self::Value> {
let version = eat_version(buf)?;
let token_len = eat_u16(buf)?;
let resume_token = eat_bytes(buf, token_len as usize)?;
let last_received_server_position = eat_u63(buf)?;
let first_available_client_position = eat_u63(buf)?;
Ok(ResumeFrame {
version,
resume_token,
last_received_server_position,
first_available_client_position,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_codec() {
let lease = ResumeFrame::new(
Version::new(1, 0),
Bytes::from("resume token"),
1,
2,
);
let mut buf = BytesMut::new();
lease.encode(&mut buf);
let mut buf = buf.freeze();
let buf_len = buf.len();
assert_eq!(buf_len, 4 + 2 + 4 + 2 + 12 + 8 + 8);
let stream_id = eat_stream_id(&mut buf).unwrap();
let (frame_type, flags) = eat_flags(&mut buf).unwrap();
assert_eq!(frame_type, FrameType::RESUME);
assert_eq!(flags, Flags::empty());
let decoded = ResumeFrame::decode(&mut buf, stream_id, flags).unwrap();
assert_eq!(decoded, lease);
assert_eq!(lease.len(), buf_len);
assert_eq!(decoded.len(), buf_len);
}
}