geozero 0.15.1

Zero-Copy reading and writing of geospatial data in WKT/WKB, GeoJSON, MVT, GDAL, and other formats.
use crate::postgis::postgis_diesel::sql_types::{Geography, Geometry};
use crate::wkb::Ewkb;
use std::io::Write as _;

use diesel::deserialize::{self, FromSql};
use diesel::pg::{self, Pg};
use diesel::serialize::{self, IsNull, Output, ToSql};

pub mod sql_types {
    use diesel::query_builder::QueryId;
    use diesel::sql_types::SqlType;

    #[derive(SqlType, QueryId)]
    #[diesel(postgres_type(name = "geometry"))]
    pub struct Geometry;

    #[derive(SqlType, QueryId)]
    #[diesel(postgres_type(name = "geography"))]
    pub struct Geography;
}

impl<B: AsRef<[u8]> + std::fmt::Debug> ToSql<Geometry, Pg> for Ewkb<B> {
    fn to_sql(&self, out: &mut Output<Pg>) -> serialize::Result {
        out.write_all(self.0.as_ref())?;
        Ok(IsNull::No)
    }
}

impl<B: AsRef<[u8]> + std::fmt::Debug> ToSql<Geography, Pg> for Ewkb<B> {
    fn to_sql(&self, out: &mut Output<Pg>) -> serialize::Result {
        out.write_all(self.0.as_ref())?;
        Ok(IsNull::No)
    }
}

impl FromSql<Geometry, Pg> for Ewkb<Vec<u8>> {
    fn from_sql(bytes: pg::PgValue) -> deserialize::Result<Self> {
        Ok(Self(bytes.as_bytes().to_vec()))
    }
}

impl FromSql<Geography, Pg> for Ewkb<Vec<u8>> {
    fn from_sql(bytes: pg::PgValue) -> deserialize::Result<Self> {
        Ok(Self(bytes.as_bytes().to_vec()))
    }
}