From b4074e0a712a0d28c2cad28ba3cb56886955db31 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 1 Apr 2022 14:58:59 -0600 Subject: [PATCH 1/2] to_wkt_string --- CHANGES.md | 6 +++++- src/towkt.rs | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e271d5e..db2ea6b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,8 +1,12 @@ # Changes ## next release -### Changed + +### Added * impl `std::fmt::Display` for `Wkt`. + * +* added `to_wkt_string` method to `ToWkt` + * ## 0.10.0 - 2022-02-24 ### Changed diff --git a/src/towkt.rs b/src/towkt.rs index 5655ab6..ca59e0d 100644 --- a/src/towkt.rs +++ b/src/towkt.rs @@ -10,10 +10,21 @@ use geo_types::CoordFloat; /// A trait for converting values to WKT pub trait ToWkt where - T: CoordFloat, + T: CoordFloat + std::fmt::Display, { /// Converts the value of `self` to an instance of WKT fn to_wkt(&self) -> Wkt; + + /// Serialize as a WKT string + /// + /// ``` + /// use wkt::ToWkt; + /// let point: geo_types::Geometry = geo_types::point!(x: 1.0, y: 2.0).into(); + /// assert_eq!("POINT(1 2)", &point.to_wkt_string()); + /// ``` + fn to_wkt_string(&self) -> String { + self.to_wkt().to_string() + } } fn g_point_to_w_coord(g_point: &geo_types::Coordinate) -> Coord @@ -215,7 +226,7 @@ where impl ToWkt for geo_types::Geometry where - T: CoordFloat, + T: CoordFloat + std::fmt::Display, { fn to_wkt(&self) -> Wkt { let w_geom = g_geom_to_w_geom(self); From 17825e72869884de2c39e610a24d2c65e75f0ed8 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Sat, 9 Apr 2022 10:31:45 -0500 Subject: [PATCH 2/2] add ToWkt::write_wkt Also renamed "to_wkt_string" to just "wkt_string", it's shorter and I don't think anything is lost. --- CHANGES.md | 2 +- src/towkt.rs | 30 +++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index db2ea6b..b86cb7f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ ### Added * impl `std::fmt::Display` for `Wkt`. * -* added `to_wkt_string` method to `ToWkt` +* added `wkt_string` and `write_wkt` methods to `ToWkt` trait * ## 0.10.0 - 2022-02-24 diff --git a/src/towkt.rs b/src/towkt.rs index ca59e0d..9a79e0c 100644 --- a/src/towkt.rs +++ b/src/towkt.rs @@ -12,7 +12,10 @@ pub trait ToWkt where T: CoordFloat + std::fmt::Display, { - /// Converts the value of `self` to an instance of WKT + /// Converts the value of `self` to an [`Wkt`] struct. + /// + /// Typically you won't need to call this, but by implementing it for your own type, your type + /// gains the other methods in this trait. fn to_wkt(&self) -> Wkt; /// Serialize as a WKT string @@ -20,11 +23,32 @@ where /// ``` /// use wkt::ToWkt; /// let point: geo_types::Geometry = geo_types::point!(x: 1.0, y: 2.0).into(); - /// assert_eq!("POINT(1 2)", &point.to_wkt_string()); + /// assert_eq!("POINT(1 2)", &point.wkt_string()); /// ``` - fn to_wkt_string(&self) -> String { + fn wkt_string(&self) -> String { self.to_wkt().to_string() } + + /// Write a WKT string to a [`File`](std::fs::File), or anything else that implements [`Write`](std::io::Write). + /// + /// ``` + /// use wkt::ToWkt; + /// use std::fs::File; + /// let point: geo_types::Geometry = geo_types::point!(x: 1.2, y: 3.4).into(); + /// + /// // use a vec as a fake "file" for the purpose of example, but you could equally replace the + /// // following with: + /// // let mut file = File::create("myfile.wkt").unwrap(); + /// let mut file = vec![] ; + /// + /// point.write_wkt(&mut file).unwrap(); + /// let wkt_string = String::from_utf8(file).unwrap(); + /// + /// 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()) + } } fn g_point_to_w_coord(g_point: &geo_types::Coordinate) -> Coord