use serde::{Deserialize, Serialize};
use crate::JsonObject;
use crate::crs::CoordRefSys;
use crate::feature::{Feature, FeatureType};
use crate::measures::Measures;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct FeatureCollection {
#[serde(rename = "type", default)]
pub kind: FeatureCollectionKind,
#[serde(
rename = "conformsTo",
skip_serializing_if = "Option::is_none",
default
)]
pub conforms_to: Option<Vec<String>>,
#[serde(
rename = "featureType",
skip_serializing_if = "Option::is_none",
default
)]
pub feature_type: Option<FeatureType>,
#[serde(
rename = "geometryDimension",
skip_serializing_if = "Option::is_none",
default
)]
pub geometry_dimension: Option<u8>,
#[serde(
rename = "featureSchema",
skip_serializing_if = "Option::is_none",
default
)]
pub feature_schema: Option<crate::feature::FeatureSchema>,
#[serde(
rename = "coordRefSys",
skip_serializing_if = "Option::is_none",
default
)]
pub coord_ref_sys: Option<CoordRefSys>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub measures: Option<Measures>,
pub features: Vec<Feature>,
#[serde(flatten)]
pub foreign_members: JsonObject,
}
impl Default for FeatureCollection {
fn default() -> Self {
FeatureCollection {
kind: FeatureCollectionKind::FeatureCollection,
conforms_to: None,
feature_type: None,
geometry_dimension: None,
feature_schema: None,
coord_ref_sys: None,
measures: None,
features: Vec::new(),
foreign_members: JsonObject::new(),
}
}
}
impl FeatureCollection {
pub fn new() -> Self {
FeatureCollection::default()
}
}
impl FromIterator<Feature> for FeatureCollection {
fn from_iter<I: IntoIterator<Item = Feature>>(iter: I) -> Self {
FeatureCollection {
features: iter.into_iter().collect(),
..Default::default()
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum FeatureCollectionKind {
#[default]
FeatureCollection,
}