mlt_core/decoder/
model.rs1use std::fmt;
8
9use crate::decoder::{Geometry, GeometryValues, Id, Property};
10use crate::tile::Extent;
11use crate::{DecodeState, Lazy, Parsed};
12
13#[non_exhaustive]
19pub enum Layer<'a, S: DecodeState = Lazy> {
20 Tag01(Layer01<'a, S>),
22 #[cfg(feature = "unstable-v2")]
26 Tag02(Layer01<'a, S>),
27 Unknown(Unknown<'a>),
29}
30pub type ParsedLayer<'a> = Layer<'a, Parsed>;
31
32impl<'a, S: DecodeState> fmt::Debug for Layer<'a, S>
33where
34 Layer01<'a, S>: fmt::Debug,
35{
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 match self {
38 Self::Tag01(l) => f.debug_tuple("Tag01").field(l).finish(),
39 #[cfg(feature = "unstable-v2")]
40 Self::Tag02(l) => f.debug_tuple("Tag02").field(l).finish(),
41 Self::Unknown(u) => f.debug_tuple("Unknown").field(u).finish(),
42 }
43 }
44}
45
46#[derive(Debug, Clone, Default, PartialEq)]
52pub struct Unknown<'a> {
53 pub(crate) tag: u8,
54 pub(crate) value: &'a [u8],
55}
56
57impl<'a> Unknown<'a> {
58 #[must_use]
60 pub fn tag(&self) -> u32 {
61 u32::from(self.tag)
62 }
63
64 #[must_use]
66 pub fn data(&self) -> &'a [u8] {
67 self.value
68 }
69}
70
71pub struct Layer01<'a, S: DecodeState = Lazy> {
84 pub(crate) name: &'a str,
85 pub(crate) extent: Extent,
86 pub(crate) id: Option<Id<'a, S>>,
87 pub(crate) geometry: Geometry<'a, S>,
88 pub(crate) properties: Vec<Property<'a, S>>,
89 #[cfg(fuzzing)]
90 pub(crate) layer_order: Vec<crate::decoder::fuzzing::LayerOrdering>,
91}
92
93pub type ParsedLayer01<'a> = Layer01<'a, Parsed>;
94
95impl<'a, S: DecodeState> Layer01<'a, S> {
96 #[must_use]
97 pub fn name(&self) -> &'a str {
98 self.name
99 }
100
101 #[must_use]
102 pub fn extent(&self) -> Extent {
103 self.extent
104 }
105}
106
107impl ParsedLayer01<'_> {
108 #[must_use]
115 pub fn geometry_values(&self) -> &GeometryValues {
116 &self.geometry
117 }
118
119 #[must_use]
120 pub fn feature_count(&self) -> usize {
121 self.geometry.vector_types.len()
122 }
123}
124
125impl<'a, S> fmt::Debug for Layer01<'a, S>
126where
127 S: DecodeState,
128 Option<Id<'a, S>>: fmt::Debug,
129 Geometry<'a, S>: fmt::Debug,
130 Vec<Property<'a, S>>: fmt::Debug,
131{
132 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
133 let mut s = f.debug_struct("Layer01");
134 s.field("name", &self.name)
135 .field("extent", &self.extent)
136 .field("id", &self.id)
137 .field("geometry", &self.geometry)
138 .field("properties", &self.properties);
139 #[cfg(fuzzing)]
140 s.field("layer_order", &self.layer_order);
141 s.finish()
142 }
143}
144
145impl<'a, S> Clone for Layer01<'a, S>
146where
147 S: DecodeState,
148 Option<Id<'a, S>>: Clone,
149 Geometry<'a, S>: Clone,
150 Vec<Property<'a, S>>: Clone,
151{
152 fn clone(&self) -> Self {
153 Self {
154 name: self.name,
155 extent: self.extent,
156 id: self.id.clone(),
157 geometry: self.geometry.clone(),
158 properties: self.properties.clone(),
159 #[cfg(fuzzing)]
160 layer_order: self.layer_order.clone(),
161 }
162 }
163}