From a719912eb3bd65e874c1cfad3d1f3efb7e85234e Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 26 Nov 2024 18:03:08 -0500 Subject: [PATCH] Update blanket write_wkt impl --- src/geo_types_to_wkt.rs | 34 ---------------------------------- src/to_wkt/mod.rs | 21 +++++++++++++++++++-- 2 files changed, 19 insertions(+), 36 deletions(-) diff --git a/src/geo_types_to_wkt.rs b/src/geo_types_to_wkt.rs index ea75ad6..e664ae3 100644 --- a/src/geo_types_to_wkt.rs +++ b/src/geo_types_to_wkt.rs @@ -1,6 +1,5 @@ use geo_types::CoordNum; -use crate::to_wkt::{write_multi_polygon, write_point}; use crate::types::{ Coord, GeometryCollection, LineString, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon, @@ -36,17 +35,6 @@ where } } -/// A wrapper around something that implements std::io::Write to be used with our writer traits, -/// which require std::fmt::Write -struct WriterWrapper(W); - -impl std::fmt::Write for WriterWrapper { - fn write_str(&mut self, s: &str) -> std::fmt::Result { - self.0.write(s.as_bytes()).map_err(|_| std::fmt::Error)?; - Ok(()) - } -} - /// # Examples /// ``` /// use geo_types::{point, Point}; @@ -63,17 +51,6 @@ where fn to_wkt(&self) -> Wkt { Wkt::Point(g_point_to_w_point(self)) } - - fn wkt_string(&self) -> String { - let mut s = String::new(); - write_point(&mut s, self).unwrap(); - s - } - - fn write_wkt(&self, writer: impl std::io::Write) -> std::io::Result<()> { - write_point(&mut WriterWrapper(writer), self).unwrap(); - Ok(()) - } } /// # Examples @@ -188,17 +165,6 @@ where fn to_wkt(&self) -> Wkt { g_mpolygon_to_w_mpolygon(self).into() } - - fn wkt_string(&self) -> String { - let mut s = String::new(); - write_multi_polygon(&mut s, self).unwrap(); - s - } - - fn write_wkt(&self, writer: impl std::io::Write) -> std::io::Result<()> { - write_multi_polygon(&mut WriterWrapper(writer), self).unwrap(); - Ok(()) - } } /// # Examples diff --git a/src/to_wkt/mod.rs b/src/to_wkt/mod.rs index 3581c8b..66c222f 100644 --- a/src/to_wkt/mod.rs +++ b/src/to_wkt/mod.rs @@ -8,6 +8,18 @@ pub use geo_trait_impl::{ write_rect, write_triangle, }; +/// A wrapper around something that implements std::io::Write to be used with our writer traits, +/// which require std::fmt::Write +struct WriterWrapper(W); + +impl std::fmt::Write for WriterWrapper { + fn write_str(&mut self, s: &str) -> std::fmt::Result { + // Sadly, this will lose the content of the error when mapping to std::fmt::Error + self.0.write(s.as_bytes()).map_err(|_| std::fmt::Error)?; + Ok(()) + } +} + /// A trait for converting values to WKT pub trait ToWkt where @@ -49,7 +61,12 @@ where /// /// assert_eq!(wkt_string, "POINT(1.2 3.4)"); /// ``` - fn write_wkt(&self, mut writer: impl std::io::Write) -> std::io::Result<()> { - writer.write_all(self.wkt_string().as_bytes()) + /// + /// ## Panics + /// + /// - If + fn write_wkt(&self, writer: impl std::io::Write) -> std::io::Result<()> { + write_geometry(&mut WriterWrapper(writer), &self.to_wkt()) + .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err.to_string())) } }