use std::fmt;
use crate::decoder::{Geometry, GeometryValues, Id, Property};
use crate::tile::Extent;
use crate::{DecodeState, Lazy, Parsed};
#[non_exhaustive]
pub enum Layer<'a, S: DecodeState = Lazy> {
Tag01(Layer01<'a, S>),
#[cfg(feature = "unstable-v2")]
Tag02(Layer01<'a, S>),
Unknown(Unknown<'a>),
}
pub type ParsedLayer<'a> = Layer<'a, Parsed>;
impl<'a, S: DecodeState> fmt::Debug for Layer<'a, S>
where
Layer01<'a, S>: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Tag01(l) => f.debug_tuple("Tag01").field(l).finish(),
#[cfg(feature = "unstable-v2")]
Self::Tag02(l) => f.debug_tuple("Tag02").field(l).finish(),
Self::Unknown(u) => f.debug_tuple("Unknown").field(u).finish(),
}
}
}
#[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
}
}
pub struct Layer01<'a, S: DecodeState = Lazy> {
pub(crate) name: &'a str,
pub(crate) extent: Extent,
pub(crate) id: Option<Id<'a, S>>,
pub(crate) geometry: Geometry<'a, S>,
pub(crate) properties: Vec<Property<'a, S>>,
#[cfg(fuzzing)]
pub(crate) layer_order: Vec<crate::decoder::fuzzing::LayerOrdering>,
}
pub type ParsedLayer01<'a> = Layer01<'a, Parsed>;
impl<'a, S: DecodeState> Layer01<'a, S> {
#[must_use]
pub fn name(&self) -> &'a str {
self.name
}
#[must_use]
pub fn extent(&self) -> Extent {
self.extent
}
}
impl ParsedLayer01<'_> {
#[must_use]
pub fn geometry_values(&self) -> &GeometryValues {
&self.geometry
}
#[must_use]
pub fn feature_count(&self) -> usize {
self.geometry.vector_types.len()
}
}
impl<'a, S> fmt::Debug for Layer01<'a, S>
where
S: DecodeState,
Option<Id<'a, S>>: fmt::Debug,
Geometry<'a, S>: fmt::Debug,
Vec<Property<'a, S>>: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut s = f.debug_struct("Layer01");
s.field("name", &self.name)
.field("extent", &self.extent)
.field("id", &self.id)
.field("geometry", &self.geometry)
.field("properties", &self.properties);
#[cfg(fuzzing)]
s.field("layer_order", &self.layer_order);
s.finish()
}
}
impl<'a, S> Clone for Layer01<'a, S>
where
S: DecodeState,
Option<Id<'a, S>>: Clone,
Geometry<'a, S>: Clone,
Vec<Property<'a, S>>: Clone,
{
fn clone(&self) -> Self {
Self {
name: self.name,
extent: self.extent,
id: self.id.clone(),
geometry: self.geometry.clone(),
properties: self.properties.clone(),
#[cfg(fuzzing)]
layer_order: self.layer_order.clone(),
}
}
}