use std::{io::Cursor, slice::Iter};
use crate::{
err::{DeError, SerError},
types::Buffer,
FromBytes, FromBytesWithInput, FromBytesWithInputBorrowed, Size, ToBytes,
};
pub trait Attribute<T> {
fn payload(&self) -> &Buffer;
fn set_payload<P>(&mut self, payload: &P) -> Result<(), SerError>
where
P: Size + ToBytes;
fn get_payload_as<R>(&self) -> Result<R, DeError>
where
R: FromBytes,
{
R::from_bytes(&mut Cursor::new(self.payload().as_ref()))
}
fn get_payload_as_with_len<R>(&self) -> Result<R, DeError>
where
R: FromBytesWithInput<Input = usize>,
{
R::from_bytes_with_input(
&mut Cursor::new(self.payload().as_ref()),
self.payload().len(),
)
}
fn get_payload_as_with_len_borrowed<'a, R>(&'a self) -> Result<R, DeError>
where
R: FromBytesWithInputBorrowed<'a, Input = usize>,
{
R::from_bytes_with_input(
&mut Cursor::new(self.payload().as_ref()),
self.payload().len(),
)
}
}
pub enum AttrHandle<'a, O, I> {
Owned(O),
Borrowed(&'a [I]),
}
impl<'a, O, I> AttrHandle<'a, O, I>
where
O: AsRef<[I]>,
{
pub fn new(owned: O) -> Self {
AttrHandle::Owned(owned)
}
pub fn new_borrowed(borrowed: &'a [I]) -> Self {
AttrHandle::Borrowed(borrowed)
}
pub fn iter(&self) -> Iter<'_, I> {
self.get_attrs().iter()
}
pub fn get_attrs(&self) -> &[I] {
match *self {
AttrHandle::Owned(ref o) => o.as_ref(),
AttrHandle::Borrowed(b) => b,
}
}
}