geoserde 0.5.2

Adapter between geographic features and GIS files
Documentation
use std::{convert::Infallible, vec};

use geoserde::{GeometrySerializer, GeometrySink, SerializeError};
use serde::Serialize;

fn serialize_geometry(g: impl Serialize) -> (SinkMock, Result<(), SerializeError<Infallible>>) {
    let mut sink = SinkMock::default();
    let mut sut = GeometrySerializer::new(&mut sink);
    let ret = g.serialize(&mut sut);
    (sink, ret)
}

#[test]
fn none_test() {
    let g = Option::<()>::None;
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn unit_test() {
    let g = ();
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn tuple_test() {
    let g = (geo_types::Point::new(0.0, 0.1),);
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn array_test() {
    let g = [geo_types::Point::new(0.0, 0.1)];
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn vec_test() {
    let g = vec![geo_types::Point::new(0.0, 0.1)];
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn point_test() {
    let g = geo_types::Point::new(0.0, 0.1);
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_ok());
    assert!(sink.wrote_geometry);
}

#[test]
fn line_test() {
    let g = line_0();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_ok());
    assert!(sink.wrote_geometry);
}

#[test]
fn linestring_test() {
    let g = linestring_0();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_ok());
    assert!(sink.wrote_geometry);
}

#[test]
fn polygon_test() {
    let g = polygon_0();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_ok());
    assert!(sink.wrote_geometry);
}

#[test]
fn emptry_linestring_test() {
    let g = empty_linestring();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_ok());
    assert!(sink.wrote_geometry);
}

#[test]
fn emptry_polygon_test() {
    let g = emptry_polygon();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_ok());
    assert!(sink.wrote_geometry);
}

#[test]
fn no_field_coord_test() {
    #[derive(Serialize)]
    struct Coord {}
    let g = Coord {};
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn no_field_point_test() {
    #[derive(Serialize)]
    struct Point();
    let g = Point {};
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn no_field_line_test() {
    #[derive(Serialize)]
    struct Line {}
    let g = Line {};
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn no_field_linestring_test() {
    #[derive(Serialize)]
    struct LineString();
    let g = LineString {};
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn no_field_polygon_test() {
    #[derive(Serialize)]
    struct Polygon {}
    let g = Polygon {};
    let (sink, ret) = serialize_geometry(g);
    let e = ret.unwrap_err();
    assert!(matches!(e, SerializeError::InvalidGeometryStructure { .. }));
    assert!(!sink.wrote_geometry)
}

#[test]
fn fake_point_test() {
    let g = fake_point_0();
    let (sink, ret) = serialize_geometry(g);
    ret.unwrap_err();
    assert!(!sink.wrote_geometry)
}

#[test]
fn fake_line_test() {
    let g = fake_line_0();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_err());
    assert!(!sink.wrote_geometry)
}

#[test]
fn fake_linestring_test() {
    let g = fake_linestring_0();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_err());
    assert!(!sink.wrote_geometry)
}

#[test]
fn fake_polygon_test() {
    let g = fake_polygon_0();
    let (sink, ret) = serialize_geometry(g);
    assert!(ret.is_err());
    assert!(!sink.wrote_geometry)
}

#[derive(Serialize)]
struct Point {
    x: f64,
    y: f64,
}
fn fake_point_0() -> Point {
    let geo_types::Coord { x, y } = point_0().0;
    Point { x, y }
}
fn point_0() -> geo_types::Point {
    [0.0, 0.1].into()
}
fn point_1() -> geo_types::Point {
    [1.0, 1.1].into()
}

#[derive(Serialize)]
struct Line {
    start: f64,
    end: f64,
}
fn fake_line_0() -> Line {
    Line {
        start: 1.0,
        end: 2.0,
    }
}
fn line_0() -> geo_types::Line {
    geo_types::Line::new(point_0(), point_1())
}

#[derive(Serialize)]
struct LineString(Vec<f64>);
fn fake_linestring_0() -> LineString {
    LineString(vec![0.0])
}
fn linestring_0() -> geo_types::LineString {
    geo_types::LineString::new(vec![point_0().0, point_1().0])
}
fn empty_linestring() -> geo_types::LineString {
    geo_types::LineString::<f64>(vec![])
}

#[derive(Serialize)]
struct Polygon {
    exterior: LineString,
    interior: Vec<LineString>,
}
fn fake_polygon_0() -> Polygon {
    Polygon {
        exterior: fake_linestring_0(),
        interior: vec![],
    }
}
fn polygon_0() -> geo_types::Polygon {
    geo_types::Polygon::new(linestring_0(), vec![])
}
fn emptry_polygon() -> geo_types::Polygon {
    geo_types::Polygon::new(empty_linestring(), vec![])
}

#[derive(Debug, Default)]
struct SinkMock {
    wrote_geometry: bool,
}
impl SinkMock {
    fn write_geometry(&mut self) {
        self.wrote_geometry = true;
    }
}
impl GeometrySink for SinkMock {
    type Err = Infallible;
    fn coord(&mut self, _: usize, _: f64, _: f64) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn point_start(&mut self, _: usize) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn point_end(&mut self, _: usize) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn linestring_start(&mut self, _: bool, _: usize, _: usize) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn linestring_end(&mut self, _: bool, _: usize) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn polygon_start(&mut self, _: bool, _: usize) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn polygon_end(&mut self, _: bool, _: usize) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn geometry_start(&mut self) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
    fn geometry_end(&mut self) -> Result<(), Self::Err> {
        Ok(self.write_geometry())
    }
}