use crate::decoder::model01::Layer01;
#[cfg(feature = "unstable-v2")]
use crate::decoder::model02::Layer02;
use crate::{DecodeState, Lazy, MltResult, Parsed};
#[derive(Debug)]
#[non_exhaustive]
pub enum Layer<'a, S: DecodeState = Lazy> {
Tag01(Layer01<'a, S>),
#[cfg(feature = "unstable-v2")]
Tag02(Layer02<'a, S>),
Unknown(Unknown<'a>),
}
pub type ParsedLayer<'a> = Layer<'a, Parsed>;
const TAG_LEN: u32 = 1;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct LayerBytes {
pub(crate) size: u32,
pub(crate) geometry: u32,
pub(crate) properties: u32,
pub(crate) ids: u32,
}
impl LayerBytes {
pub(crate) fn of_body(body_len: usize) -> Self {
Self {
size: u32::try_from(body_len).map_or(u32::MAX, |len| len.saturating_add(TAG_LEN)),
..Self::default()
}
}
pub(crate) fn add_geometry(&mut self, spent: usize) -> MltResult<()> {
self.geometry += u32::try_from(spent)?;
Ok(())
}
pub(crate) fn add_ids(&mut self, spent: usize) -> MltResult<()> {
self.ids += u32::try_from(spent)?;
Ok(())
}
pub(crate) fn add_properties(&mut self, spent: usize) -> MltResult<()> {
self.properties += u32::try_from(spent)?;
Ok(())
}
#[must_use]
pub fn size(&self) -> u32 {
self.size
}
#[must_use]
pub fn geometry(&self) -> u32 {
self.geometry
}
#[must_use]
pub fn properties(&self) -> u32 {
self.properties
}
#[must_use]
pub fn ids(&self) -> u32 {
self.ids
}
#[must_use]
pub fn metadata(&self) -> u32 {
self.size - self.geometry - self.properties - self.ids
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Unknown<'a> {
pub(crate) tag: u8,
pub(crate) value: &'a [u8],
}
impl<'a> Unknown<'a> {
#[must_use]
pub fn tag(&self) -> u32 {
u32::from(self.tag)
}
#[must_use]
pub fn data(&self) -> &'a [u8] {
self.value
}
}