use serde::{Deserialize, Serialize};
pub const CRS84: &str = "http://www.opengis.net/def/crs/OGC/0/CRS84";
pub const CRS84H: &str = "http://www.opengis.net/def/crs/OGC/0/CRS84h";
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CoordRefSys {
Single(RefSys),
Compound(Vec<RefSys>),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum RefSys {
Uri(String),
Reference(Reference),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Reference {
#[serde(rename = "type")]
pub kind: ReferenceKind,
pub href: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub epoch: Option<f64>,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReferenceKind {
#[default]
Reference,
}
impl CoordRefSys {
pub fn uri(uri: impl Into<String>) -> Self {
CoordRefSys::Single(RefSys::Uri(uri.into()))
}
pub fn from_epsg(code: u32) -> Self {
CoordRefSys::uri(format!("http://www.opengis.net/def/crs/EPSG/0/{code}"))
}
pub fn crs84() -> Self {
CoordRefSys::uri(CRS84)
}
pub fn is_wgs84(&self) -> bool {
matches!(
self,
CoordRefSys::Single(RefSys::Uri(uri)) if uri == CRS84 || uri == CRS84H
)
}
}