postgres_types/
geo_types_07.rs1use bytes::BytesMut;
2use fallible_iterator::FallibleIterator;
3use geo_types_0_7::{Coord, LineString, Point, Rect};
4use postgres_protocol::types;
5use std::error::Error;
6
7use crate::{FromSql, IsNull, ToSql, Type};
8
9impl<'a> FromSql<'a> for Point<f64> {
10 fn from_sql(_: &Type, raw: &[u8]) -> Result<Self, Box<dyn Error + Sync + Send>> {
11 let point = types::point_from_sql(raw)?;
12 Ok(Point::new(point.x(), point.y()))
13 }
14
15 accepts!(POINT);
16}
17
18impl ToSql for Point<f64> {
19 fn to_sql(&self, _: &Type, out: &mut BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
20 types::point_to_sql(self.x(), self.y(), out);
21 Ok(IsNull::No)
22 }
23
24 accepts!(POINT);
25 to_sql_checked!();
26}
27
28impl<'a> FromSql<'a> for Rect<f64> {
29 fn from_sql(_: &Type, raw: &[u8]) -> Result<Self, Box<dyn Error + Sync + Send>> {
30 let rect = types::box_from_sql(raw)?;
31 Ok(Rect::new(
32 (rect.lower_left().x(), rect.lower_left().y()),
33 (rect.upper_right().x(), rect.upper_right().y()),
34 ))
35 }
36
37 accepts!(BOX);
38}
39
40impl ToSql for Rect<f64> {
41 fn to_sql(&self, _: &Type, out: &mut BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
42 types::box_to_sql(self.min().x, self.min().y, self.max().x, self.max().y, out);
43 Ok(IsNull::No)
44 }
45
46 accepts!(BOX);
47 to_sql_checked!();
48}
49
50impl<'a> FromSql<'a> for LineString<f64> {
51 fn from_sql(_: &Type, raw: &[u8]) -> Result<Self, Box<dyn Error + Sync + Send>> {
52 let path = types::path_from_sql(raw)?;
53 let points = path
54 .points()
55 .map(|p| Ok(Coord { x: p.x(), y: p.y() }))
56 .collect()?;
57 Ok(LineString(points))
58 }
59
60 accepts!(PATH);
61}
62
63impl ToSql for LineString<f64> {
64 fn to_sql(&self, _: &Type, out: &mut BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
65 let closed = false; types::path_to_sql(closed, self.0.iter().map(|p| (p.x, p.y)), out)?;
67 Ok(IsNull::No)
68 }
69
70 accepts!(PATH);
71 to_sql_checked!();
72}