use derive_debug::Dbg;
use num_enum::TryFromPrimitive;
use serde::{Deserialize, Serialize};
use crate::decoder::RawStream;
use crate::utils::formatter::{opt_vec_seq, vec_seq};
use crate::{DecodeState, Lazy};
pub type Geometry<'a, S = Lazy> = <S as DecodeState>::LazyOrParsed<RawGeometry<'a>, GeometryValues>;
#[derive(Debug, PartialEq, Clone)]
pub struct RawGeometry<'a> {
pub(crate) meta: RawStream<'a>,
pub(crate) items: Vec<RawStream<'a>>,
}
#[derive(Clone, Dbg, Default, PartialEq, Eq)]
pub struct GeometryValues {
#[dbg(formatter = "vec_seq")]
pub(crate) vector_types: Vec<GeometryType>,
#[dbg(formatter = "opt_vec_seq")]
pub(crate) geometry_offsets: Option<Vec<u32>>,
#[dbg(formatter = "opt_vec_seq")]
pub(crate) part_offsets: Option<Vec<u32>>,
#[dbg(formatter = "opt_vec_seq")]
pub(crate) ring_offsets: Option<Vec<u32>>,
#[dbg(formatter = "opt_vec_seq")]
pub(crate) index_buffer: Option<Vec<u32>>,
#[dbg(formatter = "opt_vec_seq")]
pub(crate) triangles: Option<Vec<u32>>,
#[dbg(formatter = "opt_vec_seq")]
pub(crate) vertices: Option<Vec<i32>>,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
PartialOrd,
Eq,
Hash,
Ord,
TryFromPrimitive,
strum::Display,
strum::IntoStaticStr,
Serialize,
Deserialize,
)]
#[repr(u8)]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub enum GeometryType {
Point,
LineString,
Polygon,
MultiPoint,
MultiLineString,
MultiPolygon,
}