egml-io 0.0.2-alpha.1

IO operations for processing GML data.
Documentation
use crate::Error;
use crate::complexes::GmlCompositeSurface;
use crate::primitives::{GmlPolygon, GmlSurface};
use egml_core::model::geometry::primitives::SurfaceKind;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub enum GmlSurfaceKind {
    #[serde(rename(serialize = "gml:Polygon", deserialize = "Polygon"))]
    Polygon(GmlPolygon),
    #[serde(rename(serialize = "gml:CompositeSurface", deserialize = "CompositeSurface"))]
    CompositeSurface(GmlCompositeSurface),
    #[serde(rename(serialize = "gml:Surface", deserialize = "Surface"))]
    Surface(GmlSurface),
}

impl TryFrom<GmlSurfaceKind> for SurfaceKind {
    type Error = Error;

    fn try_from(item: GmlSurfaceKind) -> Result<Self, Self::Error> {
        let surface_kind = match item {
            GmlSurfaceKind::Polygon(x) => SurfaceKind::Polygon(x.try_into()?),
            GmlSurfaceKind::CompositeSurface(x) => SurfaceKind::CompositeSurface(x.try_into()?),
            GmlSurfaceKind::Surface(x) => SurfaceKind::Surface(x.try_into()?),
        };
        Ok(surface_kind)
    }
}

impl From<&SurfaceKind> for GmlSurfaceKind {
    fn from(kind: &SurfaceKind) -> Self {
        match kind {
            SurfaceKind::Polygon(p) => GmlSurfaceKind::Polygon(GmlPolygon::from(p)),
            SurfaceKind::Surface(s) => GmlSurfaceKind::Surface(GmlSurface::from(s)),
            SurfaceKind::CompositeSurface(c) => {
                GmlSurfaceKind::CompositeSurface(GmlCompositeSurface::from(c))
            }
        }
    }
}