use serde::{Deserialize, Serialize};
use crate::JsonObject;
use crate::crs::CoordRefSys;
use crate::geometry::Geometry;
use crate::measures::Measures;
use crate::time::Time;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Feature {
#[serde(rename = "type", default)]
pub kind: FeatureKind,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub id: Option<Id>,
#[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 = "featureSchema",
skip_serializing_if = "Option::is_none",
default
)]
pub feature_schema: Option<FeatureSchema>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub time: Option<Time>,
#[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>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub place: Option<Geometry>,
pub geometry: Option<Geometry>,
pub properties: Option<JsonObject>,
#[serde(flatten)]
pub foreign_members: JsonObject,
}
impl Default for Feature {
fn default() -> Self {
Feature {
kind: FeatureKind::Feature,
id: None,
conforms_to: None,
feature_type: None,
feature_schema: None,
time: None,
coord_ref_sys: None,
measures: None,
place: None,
geometry: None,
properties: None,
foreign_members: JsonObject::new(),
}
}
}
impl Feature {
pub fn new() -> Self {
Feature::default()
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum FeatureKind {
#[default]
Feature,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Id {
String(String),
Number(serde_json::Number),
}
impl From<String> for Id {
fn from(s: String) -> Self {
Id::String(s)
}
}
impl From<&str> for Id {
fn from(s: &str) -> Self {
Id::String(s.to_owned())
}
}
impl From<i64> for Id {
fn from(n: i64) -> Self {
Id::Number(n.into())
}
}
impl From<u64> for Id {
fn from(n: u64) -> Self {
Id::Number(n.into())
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FeatureType {
Single(String),
Multiple(Vec<String>),
}
impl From<String> for FeatureType {
fn from(s: String) -> Self {
FeatureType::Single(s)
}
}
impl From<&str> for FeatureType {
fn from(s: &str) -> Self {
FeatureType::Single(s.to_owned())
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FeatureSchema {
Ref(String),
PerType(std::collections::BTreeMap<String, String>),
}