mod dump;
use crate::config::Config;
use crate::signal::Signal;
#[derive(Clone, Debug)]
pub struct Blob<'a> {
config: Config,
data: BlobData<'a>,
}
impl<'a> Blob<'a> {
#[inline]
#[must_use]
pub const fn new(signal: &'a Signal, config: Config) -> Self {
Self {
config,
data: BlobData::Raw(signal.data()),
}
}
#[inline]
#[must_use]
pub const fn config(&self) -> &Config {
&self.config
}
#[inline]
pub const fn set_config(&mut self, config: Config) {
self.config = config;
}
#[inline]
#[must_use]
pub const fn is_raw(&self) -> bool {
matches!(self.data, BlobData::Raw(_))
}
#[inline]
#[must_use]
pub const fn is_encoded(&self) -> bool {
matches!(self.data, BlobData::Encoded(_))
}
#[inline]
pub fn make_raw_with_data(&mut self, data: &'a [u8]) {
self.data = BlobData::Raw(data);
}
#[inline]
pub fn make_encoded(&mut self) {
if let BlobData::Raw(data) = self.data {
self.data = BlobData::Encoded(data.into());
}
}
#[inline]
#[must_use]
pub const fn size(&self) -> usize {
match self.data {
BlobData::Raw(data) => {
data.len()
}
BlobData::Encoded(ref data) => {
data.len()
}
}
}
#[inline]
#[must_use]
pub const fn data(&self) -> &[u8] {
match self.data {
BlobData::Raw(data) => {
data
}
BlobData::Encoded(ref data) => {
data
}
}
}
}
#[derive(Clone, Debug)]
enum BlobData<'a> {
Raw(&'a [u8]),
Encoded(Box<[u8]>),
}