use crate::{ArrayBytesOffsets, ArrayBytesRaw, ArrayBytesRawOffsetsOutOfBoundsError};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ArrayBytesVariableLength<'a> {
pub(crate) bytes: ArrayBytesRaw<'a>,
pub(crate) offsets: ArrayBytesOffsets<'a>,
}
impl<'a> ArrayBytesVariableLength<'a> {
pub fn new(
bytes: impl Into<ArrayBytesRaw<'a>>,
offsets: ArrayBytesOffsets<'a>,
) -> Result<Self, ArrayBytesRawOffsetsOutOfBoundsError> {
let bytes = bytes.into();
if offsets.last() <= bytes.len() {
Ok(ArrayBytesVariableLength { bytes, offsets })
} else {
Err(ArrayBytesRawOffsetsOutOfBoundsError {
offset: offsets.last(),
len: bytes.len(),
})
}
}
pub unsafe fn new_unchecked(
bytes: impl Into<ArrayBytesRaw<'a>>,
offsets: ArrayBytesOffsets<'a>,
) -> Self {
let bytes = bytes.into();
debug_assert!(offsets.last() <= bytes.len());
Self { bytes, offsets }
}
#[must_use]
pub fn bytes(&self) -> &ArrayBytesRaw<'a> {
&self.bytes
}
#[must_use]
pub fn offsets(&self) -> &ArrayBytesOffsets<'a> {
&self.offsets
}
#[must_use]
pub fn into_parts(self) -> (ArrayBytesRaw<'a>, ArrayBytesOffsets<'a>) {
(self.bytes, self.offsets)
}
}