remove content length from serialized VersionBytes
This commit is contained in:
@@ -159,7 +159,7 @@ impl<'a> TryFrom<&'a [u8]> for VersionBytesRef<'a> {
|
|||||||
type Error = ParseError;
|
type Error = ParseError;
|
||||||
|
|
||||||
fn try_from(buf: &'a [u8]) -> Result<VersionBytesRef<'a>, ParseError> {
|
fn try_from(buf: &'a [u8]) -> Result<VersionBytesRef<'a>, ParseError> {
|
||||||
if buf.len() < BUF_VERSION_LEN_BYTES {
|
if buf.len() < VERSION_LEN {
|
||||||
return Err(ParseError::InvalidLength);
|
return Err(ParseError::InvalidLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,18 +167,7 @@ impl<'a> TryFrom<&'a [u8]> for VersionBytesRef<'a> {
|
|||||||
version.copy_from_slice(&buf[0..16]);
|
version.copy_from_slice(&buf[0..16]);
|
||||||
let version = Uuid::from_bytes(version);
|
let version = Uuid::from_bytes(version);
|
||||||
|
|
||||||
let mut len = [0; 8];
|
Ok(VersionBytesRef::new(version, &buf[VERSION_LEN..]))
|
||||||
len.copy_from_slice(&buf[16..24]);
|
|
||||||
let len =
|
|
||||||
usize::try_from(u64::from_le_bytes(len)).map_err(|_| ParseError::InvalidLength)?;
|
|
||||||
|
|
||||||
// TODO: check for max len?
|
|
||||||
|
|
||||||
if buf.len() - BUF_VERSION_LEN_BYTES != len {
|
|
||||||
return Err(ParseError::InvalidLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(VersionBytesRef::new(version, &buf[BUF_VERSION_LEN_BYTES..]))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,26 +185,20 @@ impl fmt::Display for ParseError {
|
|||||||
|
|
||||||
impl std::error::Error for ParseError {}
|
impl std::error::Error for ParseError {}
|
||||||
|
|
||||||
const BUF_VERSION_LEN_BYTES: usize = 16 + 8;
|
const VERSION_LEN: usize = 16;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct VersionBytesBuf<'a> {
|
pub struct VersionBytesBuf<'a> {
|
||||||
pos: usize,
|
pos: usize,
|
||||||
version_len: [u8; BUF_VERSION_LEN_BYTES],
|
version: [u8; VERSION_LEN],
|
||||||
content: &'a [u8],
|
content: &'a [u8],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> VersionBytesBuf<'a> {
|
impl<'a> VersionBytesBuf<'a> {
|
||||||
pub fn new(version: Uuid, content: &'a [u8]) -> VersionBytesBuf<'a> {
|
pub fn new(version: Uuid, content: &'a [u8]) -> VersionBytesBuf<'a> {
|
||||||
let mut version_len = [0; BUF_VERSION_LEN_BYTES];
|
|
||||||
version_len[0..16].copy_from_slice(version.as_bytes());
|
|
||||||
|
|
||||||
let len = u64::try_from(content.len()).expect("Could not convert len (usize) into u64");
|
|
||||||
version_len[16..].copy_from_slice(&len.to_le_bytes());
|
|
||||||
|
|
||||||
VersionBytesBuf {
|
VersionBytesBuf {
|
||||||
pos: 0,
|
pos: 0,
|
||||||
version_len,
|
version: *version.as_bytes(),
|
||||||
content,
|
content,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,14 +206,14 @@ impl<'a> VersionBytesBuf<'a> {
|
|||||||
|
|
||||||
impl<'a> ::bytes::Buf for VersionBytesBuf<'a> {
|
impl<'a> ::bytes::Buf for VersionBytesBuf<'a> {
|
||||||
fn remaining(&self) -> usize {
|
fn remaining(&self) -> usize {
|
||||||
BUF_VERSION_LEN_BYTES + self.content.len() - self.pos
|
VERSION_LEN + self.content.len() - self.pos
|
||||||
}
|
}
|
||||||
|
|
||||||
fn chunk(&self) -> &[u8] {
|
fn chunk(&self) -> &[u8] {
|
||||||
if self.pos < BUF_VERSION_LEN_BYTES {
|
if self.pos < VERSION_LEN {
|
||||||
&self.version_len[self.pos..]
|
&self.version[self.pos..]
|
||||||
} else {
|
} else {
|
||||||
let pos = self.pos - BUF_VERSION_LEN_BYTES;
|
let pos = self.pos - VERSION_LEN;
|
||||||
if self.content.len() <= pos {
|
if self.content.len() <= pos {
|
||||||
&[]
|
&[]
|
||||||
} else {
|
} else {
|
||||||
@@ -251,8 +234,8 @@ impl<'a> ::bytes::Buf for VersionBytesBuf<'a> {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.pos < BUF_VERSION_LEN_BYTES {
|
if self.pos < VERSION_LEN {
|
||||||
dst[0] = IoSlice::new(&self.version_len[self.pos..]);
|
dst[0] = IoSlice::new(&self.version[self.pos..]);
|
||||||
|
|
||||||
if dst.len() == 1 {
|
if dst.len() == 1 {
|
||||||
1
|
1
|
||||||
@@ -261,7 +244,7 @@ impl<'a> ::bytes::Buf for VersionBytesBuf<'a> {
|
|||||||
2
|
2
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let pos = self.pos - BUF_VERSION_LEN_BYTES;
|
let pos = self.pos - VERSION_LEN;
|
||||||
if self.content.len() <= pos {
|
if self.content.len() <= pos {
|
||||||
0
|
0
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user