Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

ToWkt for integer types #101

Merged
merged 1 commit into from
May 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# Changes

## UNRELEASED

* add support for serializing integer geometries, so you can now:
`geo_types::Point::new(1i32, 2i32).wkt_string()`
Note that deserializing integer geometries is not yet supported.
* docs.rs documentation now shows all optional features.
* <https://github.com/georust/wkt/pull/98>
* docs.rs documentation items are annotated with their feature requirements.
Expand Down
78 changes: 49 additions & 29 deletions src/geo_types_to_wkt.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use geo_types::CoordFloat;
use geo_types::CoordNum;

use crate::types::{
Coord, GeometryCollection, LineString, MultiLineString, MultiPoint, MultiPolygon, Point,
Expand All @@ -17,7 +17,7 @@ use crate::{Geometry, ToWkt, Wkt};
/// ```
impl<T> ToWkt<T> for geo_types::Geometry<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
match self {
Expand Down Expand Up @@ -46,7 +46,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::Point<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -66,7 +66,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::Line<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -86,7 +86,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::LineString<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -106,7 +106,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::Polygon<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -126,7 +126,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::MultiPoint<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -148,7 +148,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::MultiLineString<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -172,7 +172,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::MultiPolygon<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -194,7 +194,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::GeometryCollection<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -214,7 +214,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::Rect<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -234,7 +234,7 @@ where
/// ```
impl<T> ToWkt<T> for geo_types::Triangle<T>
where
T: CoordFloat + std::fmt::Display,
T: CoordNum + std::fmt::Display,
{
fn to_wkt(&self) -> Wkt<T> {
Wkt {
Expand All @@ -245,7 +245,7 @@ where

fn g_point_to_w_coord<T>(g_point: &geo_types::Coordinate<T>) -> Coord<T>
where
T: CoordFloat,
T: CoordNum,
{
Coord {
x: g_point.x,
Expand All @@ -257,22 +257,22 @@ where

fn g_point_to_w_point<T>(g_point: &geo_types::Point<T>) -> Point<T>
where
T: CoordFloat,
T: CoordNum,
{
let coord = g_point_to_w_coord(&g_point.0);
Point(Some(coord))
}

fn g_points_to_w_coords<T>(g_points: &[geo_types::Coordinate<T>]) -> Vec<Coord<T>>
where
T: CoordFloat,
T: CoordNum,
{
g_points.iter().map(g_point_to_w_coord).collect()
}

fn g_points_to_w_points<T>(g_points: &[geo_types::Point<T>]) -> Vec<Point<T>>
where
T: CoordFloat,
T: CoordNum,
{
g_points
.iter()
Expand All @@ -284,30 +284,30 @@ where

fn g_line_to_w_linestring<T>(g_line: &geo_types::Line<T>) -> LineString<T>
where
T: CoordFloat,
T: CoordNum,
{
g_points_to_w_linestring(&[g_line.start, g_line.end])
}

fn g_linestring_to_w_linestring<T>(g_linestring: &geo_types::LineString<T>) -> LineString<T>
where
T: CoordFloat,
T: CoordNum,
{
let &geo_types::LineString(ref g_points) = g_linestring;
g_points_to_w_linestring(g_points)
}

fn g_points_to_w_linestring<T>(g_coords: &[geo_types::Coordinate<T>]) -> LineString<T>
where
T: CoordFloat,
T: CoordNum,
{
let w_coords = g_points_to_w_coords(g_coords);
LineString(w_coords)
}

fn g_lines_to_w_lines<T>(g_lines: &[geo_types::LineString<T>]) -> Vec<LineString<T>>
where
T: CoordFloat,
T: CoordNum,
{
let mut w_lines = vec![];
for g_line in g_lines {
Expand All @@ -319,23 +319,23 @@ where

fn g_triangle_to_w_polygon<T>(g_triangle: &geo_types::Triangle<T>) -> Polygon<T>
where
T: CoordFloat,
T: CoordNum,
{
let polygon = g_triangle.to_polygon();
g_polygon_to_w_polygon(&polygon)
}

fn g_rect_to_w_polygon<T>(g_rect: &geo_types::Rect<T>) -> Polygon<T>
where
T: CoordFloat,
T: CoordNum,
{
let polygon = g_rect.to_polygon();
g_polygon_to_w_polygon(&polygon)
}

fn g_polygon_to_w_polygon<T>(g_polygon: &geo_types::Polygon<T>) -> Polygon<T>
where
T: CoordFloat,
T: CoordNum,
{
let outer_line = g_polygon.exterior();
let inner_lines = g_polygon.interiors();
Expand All @@ -356,7 +356,7 @@ where

fn g_mpoint_to_w_mpoint<T>(g_mpoint: &geo_types::MultiPoint<T>) -> MultiPoint<T>
where
T: CoordFloat,
T: CoordNum,
{
let &geo_types::MultiPoint(ref g_points) = g_mpoint;
let w_points = g_points_to_w_points(g_points);
Expand All @@ -365,7 +365,7 @@ where

fn g_mline_to_w_mline<T>(g_mline: &geo_types::MultiLineString<T>) -> MultiLineString<T>
where
T: CoordFloat,
T: CoordNum,
{
let &geo_types::MultiLineString(ref g_lines) = g_mline;
let w_lines = g_lines_to_w_lines(g_lines);
Expand All @@ -374,7 +374,7 @@ where

fn g_polygons_to_w_polygons<T>(g_polygons: &[geo_types::Polygon<T>]) -> Vec<Polygon<T>>
where
T: CoordFloat,
T: CoordNum,
{
let mut w_polygons = vec![];
for g_polygon in g_polygons {
Expand All @@ -385,7 +385,7 @@ where

fn g_mpolygon_to_w_mpolygon<T>(g_mpolygon: &geo_types::MultiPolygon<T>) -> MultiPolygon<T>
where
T: CoordFloat,
T: CoordNum,
{
let &geo_types::MultiPolygon(ref g_polygons) = g_mpolygon;
let w_polygons = g_polygons_to_w_polygons(g_polygons);
Expand All @@ -394,7 +394,7 @@ where

fn g_geocol_to_w_geocol<T>(g_geocol: &geo_types::GeometryCollection<T>) -> GeometryCollection<T>
where
T: CoordFloat,
T: CoordNum,
{
let &geo_types::GeometryCollection(ref g_geoms) = g_geocol;
let mut w_geoms = vec![];
Expand All @@ -407,7 +407,7 @@ where

fn g_geom_to_w_geom<T>(g_geom: &geo_types::Geometry<T>) -> Geometry<T>
where
T: CoordFloat,
T: CoordNum,
{
match *g_geom {
geo_types::Geometry::Point(ref g_point) => g_point_to_w_point(g_point).as_item(),
Expand Down Expand Up @@ -439,3 +439,23 @@ where
}
}
}

#[cfg(test)]
mod tests {
use crate::ToWkt;

#[test]
fn integer_geom() {
let point = geo_types::Point::new(1i32, 2i32);
assert_eq!("POINT(1 2)", &point.wkt_string());
}

#[test]
fn float_geom() {
let point = geo_types::Point::new(1f32, 2f32);
assert_eq!("POINT(1 2)", &point.wkt_string());

let point = geo_types::Point::new(1.1f32, 2.9f32);
assert_eq!("POINT(1.1 2.9)", &point.wkt_string());
}
}
17 changes: 11 additions & 6 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,19 @@ pub use from_wkt::TryFromWkt;
#[cfg(all(feature = "serde", feature = "geo-types"))]
pub use deserialize::{deserialize_geometry, deserialize_point};

pub trait WktFloat: num_traits::Float + std::fmt::Debug {}
impl<T> WktFloat for T where T: num_traits::Float + std::fmt::Debug {}
use num_traits::{Float, Num, NumCast};

pub trait WktNum: Num + NumCast + Copy + fmt::Debug {}
impl<T> WktNum for T where T: Num + NumCast + Copy + fmt::Debug {}

pub trait WktFloat: WktNum + Float {}
impl<T> WktFloat for T where T: WktNum + Float {}

#[derive(Clone, Debug)]
/// All supported WKT geometry [`types`]
pub enum Geometry<T>
where
T: WktFloat,
T: WktNum,
{
Point(Point<T>),
LineString(LineString<T>),
Expand Down Expand Up @@ -183,7 +188,7 @@ where

impl<T> fmt::Display for Geometry<T>
where
T: WktFloat + fmt::Display,
T: WktNum + fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match self {
Expand All @@ -204,7 +209,7 @@ where
/// This type can be fallibly converted to a [`geo_types`] primitive using [`std::convert::TryFrom`].
pub struct Wkt<T>
where
T: WktFloat,
T: WktNum,
{
pub item: Geometry<T>,
}
Expand Down Expand Up @@ -244,7 +249,7 @@ where

impl<T> fmt::Display for Wkt<T>
where
T: WktFloat + fmt::Debug + fmt::Display,
T: WktNum + fmt::Debug + fmt::Display,
{
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.item.fmt(formatter)
Expand Down
4 changes: 2 additions & 2 deletions src/to_wkt.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use crate::{Wkt, WktFloat};
use crate::{Wkt, WktNum};

/// A trait for converting values to WKT
pub trait ToWkt<T>
where
T: WktFloat + std::fmt::Display,
T: WktNum + std::fmt::Display,
{
/// Converts the value of `self` to an [`Wkt`] struct.
///
Expand Down
6 changes: 3 additions & 3 deletions src/types/coord.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@
// limitations under the License.

use crate::tokenizer::{PeekableTokens, Token};
use crate::{FromTokens, WktFloat};
use crate::{FromTokens, WktFloat, WktNum};
use std::fmt;
use std::str::FromStr;

#[derive(Clone, Debug, Default)]
pub struct Coord<T>
where
T: WktFloat,
T: WktNum,
{
pub x: T,
pub y: T,
Expand All @@ -30,7 +30,7 @@ where

impl<T> fmt::Display for Coord<T>
where
T: WktFloat + fmt::Display,
T: WktNum + fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "{} {}", self.x, self.y)?;
Expand Down
Loading