packages feed

esqueleto-postgis 1.2.0 → 2.0.0

raw patch · 13 files changed

+64/−97 lines, 13 filesdep ~geojsonPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: geojson

API changes (from Hackage documentation)

- Database.Esqueleto.Postgis.Ewkb.Geometry: EwkbGeom :: WkbGeometryType -> SridType -> EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: NoSrid :: SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: Srid :: Word32 -> SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: builderEwkbGeom :: EndianType -> EwkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Ewkb.Geometry: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Ewkb.Geometry: data EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: data SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: getEwkbGeom :: EndianType -> Get EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: getWkbGeom :: EndianType -> Get WkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Ewkb.Geometry.EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Ewkb.Geometry.SridType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Ewkb.Geometry.EwkbGeometryType
- Database.Esqueleto.Postgis.Ewkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Ewkb.Geometry.SridType
- Database.Esqueleto.Postgis.Hex: Hex :: ByteString -> Hex
- Database.Esqueleto.Postgis.Hex: newtype Hex
- Database.Esqueleto.Postgis.Hex: safeConvert :: (ByteString -> Either String GeospatialGeometry) -> Hex -> Either String GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Endian: BigEndian :: EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: LittleEndian :: EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: builderDouble :: EndianType -> Double -> Builder
- Database.Esqueleto.Postgis.Wkb.Endian: builderEndianType :: EndianType -> Builder
- Database.Esqueleto.Postgis.Wkb.Endian: builderFourBytes :: EndianType -> Word32 -> Builder
- Database.Esqueleto.Postgis.Wkb.Endian: data EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: getDouble :: EndianType -> Get Double
- Database.Esqueleto.Postgis.Wkb.Endian: getEndianType :: Get EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: getFourBytes :: EndianType -> Get Word32
- Database.Esqueleto.Postgis.Wkb.Endian: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Endian.EndianType
- Database.Esqueleto.Postgis.Wkb.Endian: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Endian.EndianType
- Database.Esqueleto.Postgis.Wkb.Geometry: Geometry :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: GeometryCollection :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: LineString :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: M :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: MultiLineString :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: MultiPoint :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: MultiPolygon :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: Point :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: Polygon :: GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: TwoD :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: WkbGeom :: GeometryType -> CoordinateType -> WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: Z :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: ZM :: CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Wkb.Geometry: coordTypeOfLinearRings :: Seq (LinearRing GeoPositionWithoutCRS) -> CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: coordTypeOfSequence :: Seq GeoPositionWithoutCRS -> CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: data CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: data GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: data WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: geoPositionWithoutCRSToCoordinateType :: GeoPositionWithoutCRS -> Maybe CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: getWkbGeom :: EndianType -> Get WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Geometry.CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Geometry.GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Classes.Eq Database.Esqueleto.Postgis.Wkb.Geometry.WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Geometry.CoordinateType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Geometry.GeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: instance GHC.Show.Show Database.Esqueleto.Postgis.Wkb.Geometry.WkbGeometryType
- Database.Esqueleto.Postgis.Wkb.Geometry: type BuilderWkbGeometryType = EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Wkb.GeometryCollection: builderGeometryCollection :: BuilderGeospatialFeature -> BuilderWkbGeometryType -> EndianType -> Seq GeospatialGeometry -> Builder
- Database.Esqueleto.Postgis.Wkb.GeometryCollection: getEnclosedFeature :: (EndianType -> Get WkbGeometryType) -> GeometryType -> (EndianType -> CoordinateType -> Get feature) -> Get feature
- Database.Esqueleto.Postgis.Wkb.GeometryCollection: getGeometryCollection :: Get GeospatialGeometry -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Geospatial: builderGeospatialGeometry :: BuilderWkbGeometryType -> EndianType -> GeospatialGeometry -> Builder
- Database.Esqueleto.Postgis.Wkb.Geospatial: getGeospatialGeometry :: (EndianType -> Get WkbGeometryType) -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Line: builderLine :: BuilderWkbGeometryType -> EndianType -> GeoLine -> Builder
- Database.Esqueleto.Postgis.Wkb.Line: builderMultiLine :: BuilderWkbGeometryType -> EndianType -> GeoMultiLine -> Builder
- Database.Esqueleto.Postgis.Wkb.Line: getLine :: EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Line: getMultiLine :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Point: builderCoordPoint :: EndianType -> GeoPositionWithoutCRS -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: builderCoordPoints :: EndianType -> Seq GeoPositionWithoutCRS -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: builderMultiPoint :: BuilderWkbGeometryType -> EndianType -> GeoMultiPoint -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: builderPoint :: BuilderWkbGeometryType -> EndianType -> GeoPoint -> Builder
- Database.Esqueleto.Postgis.Wkb.Point: getCoordPoint :: EndianType -> CoordinateType -> Get GeoPositionWithoutCRS
- Database.Esqueleto.Postgis.Wkb.Point: getCoordPoints :: EndianType -> CoordinateType -> Word32 -> Get (Seq GeoPositionWithoutCRS)
- Database.Esqueleto.Postgis.Wkb.Point: getGeoPoint :: EndianType -> CoordinateType -> Get GeoPoint
- Database.Esqueleto.Postgis.Wkb.Point: getMultiPoint :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Point: getPoint :: EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Polygon: builderMultiPolygon :: BuilderWkbGeometryType -> EndianType -> GeoMultiPolygon -> Builder
- Database.Esqueleto.Postgis.Wkb.Polygon: builderPolygon :: BuilderWkbGeometryType -> EndianType -> GeoPolygon -> Builder
- Database.Esqueleto.Postgis.Wkb.Polygon: getMultiPolygon :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb.Polygon: getPolygon :: EndianType -> CoordinateType -> Get GeospatialGeometry
+ Database.Esqueleto.Postgis.Ewkb: EwkbGeom :: WkbGeometryType -> SridType -> EwkbGeometryType
+ Database.Esqueleto.Postgis.Ewkb: NoSrid :: SridType
+ Database.Esqueleto.Postgis.Ewkb: Srid :: Word32 -> SridType
+ Database.Esqueleto.Postgis.Ewkb: builderEwkbGeom :: EndianType -> EwkbGeometryType -> Builder
+ Database.Esqueleto.Postgis.Ewkb: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
+ Database.Esqueleto.Postgis.Ewkb: data EwkbGeometryType
+ Database.Esqueleto.Postgis.Ewkb: data SridType
+ Database.Esqueleto.Postgis.Ewkb: getEwkbGeom :: EndianType -> Get EwkbGeometryType
+ Database.Esqueleto.Postgis.Ewkb: getWkbGeom :: EndianType -> Get WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: BigEndian :: EndianType
+ Database.Esqueleto.Postgis.Wkb: Geometry :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: GeometryCollection :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: LineString :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: LittleEndian :: EndianType
+ Database.Esqueleto.Postgis.Wkb: M :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: MultiLineString :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: MultiPoint :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: MultiPolygon :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: Point :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: Polygon :: GeometryType
+ Database.Esqueleto.Postgis.Wkb: TwoD :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: WkbGeom :: GeometryType -> CoordinateType -> WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: Z :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: ZM :: CoordinateType
+ Database.Esqueleto.Postgis.Wkb: builderCoordPoint :: EndianType -> GeoPositionWithoutCRS -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderCoordPoints :: EndianType -> Seq GeoPositionWithoutCRS -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderDouble :: EndianType -> Double -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderEndianType :: EndianType -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderFourBytes :: EndianType -> Word32 -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderMultiPoint :: BuilderWkbGeometryType -> EndianType -> GeoMultiPoint -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderPoint :: BuilderWkbGeometryType -> EndianType -> GeoPoint -> Builder
+ Database.Esqueleto.Postgis.Wkb: builderWkbGeom :: EndianType -> WkbGeometryType -> Builder
+ Database.Esqueleto.Postgis.Wkb: coordTypeOfLinearRings :: Seq (LinearRing GeoPositionWithoutCRS) -> CoordinateType
+ Database.Esqueleto.Postgis.Wkb: coordTypeOfSequence :: Seq GeoPositionWithoutCRS -> CoordinateType
+ Database.Esqueleto.Postgis.Wkb: data CoordinateType
+ Database.Esqueleto.Postgis.Wkb: data EndianType
+ Database.Esqueleto.Postgis.Wkb: data GeometryType
+ Database.Esqueleto.Postgis.Wkb: data WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: geoPositionWithoutCRSToCoordinateType :: GeoPositionWithoutCRS -> Maybe CoordinateType
+ Database.Esqueleto.Postgis.Wkb: getCoordPoint :: EndianType -> CoordinateType -> Get GeoPositionWithoutCRS
+ Database.Esqueleto.Postgis.Wkb: getCoordPoints :: EndianType -> CoordinateType -> Word32 -> Get (Seq GeoPositionWithoutCRS)
+ Database.Esqueleto.Postgis.Wkb: getDouble :: EndianType -> Get Double
+ Database.Esqueleto.Postgis.Wkb: getEndianType :: Get EndianType
+ Database.Esqueleto.Postgis.Wkb: getFourBytes :: EndianType -> Get Word32
+ Database.Esqueleto.Postgis.Wkb: getGeoPoint :: EndianType -> CoordinateType -> Get GeoPoint
+ Database.Esqueleto.Postgis.Wkb: getMultiPoint :: (EndianType -> Get WkbGeometryType) -> EndianType -> CoordinateType -> Get GeospatialGeometry
+ Database.Esqueleto.Postgis.Wkb: getPoint :: EndianType -> CoordinateType -> Get GeospatialGeometry
+ Database.Esqueleto.Postgis.Wkb: getWkbGeom :: EndianType -> Get WkbGeometryType
+ Database.Esqueleto.Postgis.Wkb: type BuilderWkbGeometryType = EndianType -> WkbGeometryType -> Builder
- Database.Esqueleto.Postgis.Ewkb: parseHexByteString :: Hex -> Either String GeospatialGeometry
+ Database.Esqueleto.Postgis.Ewkb: parseHexByteString :: Base16 ByteString -> Either String GeospatialGeometry
- Database.Esqueleto.Postgis.Wkb: parseHexByteString :: Hex -> Either String GeospatialGeometry
+ Database.Esqueleto.Postgis.Wkb: parseHexByteString :: Base16 ByteString -> Either String GeospatialGeometry

Files

Changelog.md view
@@ -1,5 +1,10 @@ # Change log for esqueleto-postgis project +## Version 2.0.0 +* Hide irrelevant modules+* delete hex module, use base16 hex approach instead.+* Much better docs that explain what's going on.+ ## Version 1.2.0  + re-export point, less annoying to use. + adopt wkt-geom package and put it in as a submodule,
esqueleto-postgis.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           esqueleto-postgis-version:        1.2.0+version:        2.0.0 homepage:       https://github.com/jappeace/esqueleto-postgis#readme bug-reports:    https://github.com/jappeace/esqueleto-postgis/issues author:         Jappie Klooster@@ -64,7 +64,7 @@       esqueleto >= 3.5.10 && < 3.7,       text >= 1.2.5 && < 2.2,       persistent >= 2.13.3 && < 2.19,-      geojson >= 4.1.0 && < 4.2,+      geojson >= 4.1.1 && < 4.2,       bytestring < 2,       base16 >= 1.0 && < 1.1,       binary < 1,@@ -77,16 +77,16 @@   exposed-modules:       Database.Esqueleto.Postgis       Database.Esqueleto.Postgis.Ewkb-      Database.Esqueleto.Postgis.Hex-      Database.Esqueleto.Postgis.Ewkb.Geometry+      Database.Esqueleto.Postgis.Wkb+  other-modules:       Database.Esqueleto.Postgis.Wkb.Endian+      Database.Esqueleto.Postgis.Wkb.Point       Database.Esqueleto.Postgis.Wkb.Geometry+      Database.Esqueleto.Postgis.Ewkb.Geometry       Database.Esqueleto.Postgis.Wkb.GeometryCollection-      Database.Esqueleto.Postgis.Wkb.Geospatial       Database.Esqueleto.Postgis.Wkb.Line-      Database.Esqueleto.Postgis.Wkb.Point       Database.Esqueleto.Postgis.Wkb.Polygon-      Database.Esqueleto.Postgis.Wkb+      Database.Esqueleto.Postgis.Wkb.Geospatial    hs-source-dirs:       src@@ -104,7 +104,6 @@         Wkb.EndianSpec         Wkb.GeometryCollectionSpec         Wkb.GeometrySpec-        Wkb.HexParsingSpec         Wkb.LineSpec         Wkb.PointSpec         Wkb.PolygonSpec
src/Database/Esqueleto/Postgis.hs view
@@ -32,7 +32,6 @@ import Data.Foldable (Foldable (toList), fold) import Data.Geospatial (GeoPoint (..), GeoPositionWithoutCRS (..), GeospatialGeometry, PointXY (..), PointXYZ (..), PointXYZM (..)) import Data.Geospatial qualified as Geospatial-import Database.Esqueleto.Postgis.Hex (Hex (..)) import Data.LineString (LineString, fromLineString, lineStringHead) import Data.LinearRing (LinearRing, fromLinearRing, makeLinearRing, ringHead, toSeq) import Data.List qualified as List@@ -49,6 +48,8 @@ import Database.Esqueleto.Experimental (SqlExpr, Value) import Database.Esqueleto.Internal.Internal (unsafeSqlFunction) import Database.Persist.Sql+import Data.Base16.Types(assertBase16)+import Data.ByteString(fromStrict)  -- | unwrap postgis geometry so you can for example return it from an API getPoints :: PostgisGeometry point -> NonEmpty point@@ -205,7 +206,7 @@   toPersistValue geom =     PersistText $ toStrict $ toLazyText $ renderGeometry $ renderPair <$> geom   fromPersistValue (PersistLiteral_ Escaped bs) = do-    result <- first pack $ parseHexByteString (Hex bs)+    result <- first pack $ parseHexByteString $ assertBase16 $ fromStrict bs     first tshow $ (from2dGeospatialGeometry from2dGeoPositionWithoutCRSToPoint) result   fromPersistValue other = Left ("PersistField.Polygon: invalid persist value:" <> tshow other) @@ -213,7 +214,7 @@   toPersistValue geom =     PersistText $ toStrict $ toLazyText $ renderGeometry $ renderXYZ <$> geom   fromPersistValue (PersistLiteral_ Escaped bs) = do-    result <- first pack $ parseHexByteString (Hex bs)+    result <- first pack $ parseHexByteString $ assertBase16 $ fromStrict bs     first tshow $ (from2dGeospatialGeometry from3dGeoPositionWithoutCRSToPoint) result   fromPersistValue other = Left ("PersistField.Polygon: invalid persist value:" <> tshow other) @@ -221,7 +222,7 @@   toPersistValue geom =     PersistText $ toStrict $ toLazyText $ renderGeometry $ renderXYZM <$> geom   fromPersistValue (PersistLiteral_ Escaped bs) = do-    result <- first pack $ parseHexByteString (Hex bs)+    result <- first pack $ parseHexByteString $ assertBase16 $ fromStrict bs     first tshow $ (from2dGeospatialGeometry from4dGeoPositionWithoutCRSToPoint) result   fromPersistValue other = Left ("PersistField.Polygon: invalid persist value:" <> tshow other) 
src/Database/Esqueleto/Postgis/Ewkb.hs view
@@ -1,4 +1,4 @@--- | I copied these because the original libraryy doesn't+--  I copied these because the original libraryy doesn't --   appear to be maintained. --   I'm only interested in this parseHexBytestring function. --@@ -7,27 +7,33 @@ --   Apache license -- ----- Refer to the eWKB Postgis Documentation <https://postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT>+-- | Ewkb is the basis for postgis in postgres.+--  This module  Allows parsing of ByteString into a Geospatial Object. ----- Allows parsing of ByteString into a Geospatial Object.+-- These functions are used in the instance 'Database.Persist.Class.PersistField' instance+-- to parse the database base16 output into types we can use. ----------------------------------------------------------------------+-- Refer to the eWKB Postgis Documentation <https://postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT>+-- module Database.Esqueleto.Postgis.Ewkb   ( parseByteString   , parseHexByteString   , toByteString+  -- * Core+  -- | the greasy gears inside for experienced users or the brave!+  , module EwkbGeometry   ) where  import qualified Data.Binary.Get              as BinaryGet import qualified Data.ByteString.Builder      as ByteStringBuilder import qualified Data.ByteString.Lazy         as LazyByteString import qualified Data.Geospatial              as Geospatial-import qualified Database.Esqueleto.Postgis.Hex  as Hex -import qualified Database.Esqueleto.Postgis.Ewkb.Geometry  as EwkbGeometry+import Database.Esqueleto.Postgis.Ewkb.Geometry  as EwkbGeometry import qualified Database.Esqueleto.Postgis.Wkb.Endian     as Endian import qualified Database.Esqueleto.Postgis.Wkb.Geospatial as WkbGeospatial-+import Data.ByteString.Lazy.Base16(decodeBase16)+import Data.Base16.Types(Base16) -- | -- Representation of EWKB as Binary parseByteString :: LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry@@ -40,8 +46,8 @@  -- | -- Representation of EWKB as a String in Base16/Hex form i.e. "0101000000000000000000f03f0000000000000040" is POINT 1.0 2.0-parseHexByteString :: Hex.Hex -> Either String Geospatial.GeospatialGeometry-parseHexByteString = Hex.safeConvert parseByteString+parseHexByteString :: Base16 LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry+parseHexByteString = parseByteString . decodeBase16  -- | -- Produce the binary representation of EWKB given its EndianType (Little or Big - Intel is Little) and SRID (4326 for example).
− src/Database/Esqueleto/Postgis/Hex.hs
@@ -1,23 +0,0 @@---- | friendly copied from github.com/zellige/wkt-geom.git---   Copyright 2017-2018 wkt-geom Project---   Apache license-module Database.Esqueleto.Postgis.Hex-  ( safeConvert-  , Hex(..)-  ) where--import qualified Data.ByteString        as ByteString-import qualified Data.ByteString.Base16 as ByteStringBase16-import qualified Data.ByteString.Char8  as ByteStringChar8-import qualified Data.ByteString.Lazy   as LazyByteString-import qualified Data.Geospatial        as Geospatial--newtype Hex = Hex ByteString.ByteString--safeConvert :: (LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry) -> Hex -> Either String Geospatial.GeospatialGeometry-safeConvert f (Hex byteString) =-    case ByteStringBase16.decodeBase16Untyped byteString of-         Left  _       -> Left $ "Invalid hex representation: " <> ByteStringChar8.unpack byteString-         Right decoded -> f    $ LazyByteString.fromStrict decoded-
src/Database/Esqueleto/Postgis/Wkb.hs view
@@ -1,23 +1,36 @@--- Refer to the WKB Wikipedia page <https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary>+-- | Ewkb is deeply integrated into Wkb, which is why we kept this around.+-- For postgis we mostly want Ewkb. ----- Allows parsing of ByteString into a Geospatial Object.+-- This module Allows parsing of ByteString into a Geospatial Object,+-- and provides foundational elements for constructing an Ewkb. ----------------------------------------------------------------------+-- Refer to the WKB Wikipedia page <https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary> module Database.Esqueleto.Postgis.Wkb   ( parseByteString   , parseHexByteString   , toByteString+  -- * Core+  -- | the greasy gears inside for experienced users or the brave!++  -- ** Geometry+  , module Geometry+  -- ** Endian+  , module Endian+  -- ** Point+  , module Point   ) where  import qualified Data.Binary.Get              as BinaryGet import qualified Data.ByteString.Builder      as ByteStringBuilder import qualified Data.ByteString.Lazy         as LazyByteString import qualified Data.Geospatial              as Geospatial-import qualified Database.Esqueleto.Postgis.Hex                     as Hex -import qualified Database.Esqueleto.Postgis.Wkb.Endian     as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry   as Geometry+import Database.Esqueleto.Postgis.Wkb.Endian     as Endian+import Database.Esqueleto.Postgis.Wkb.Geometry   as Geometry+import Database.Esqueleto.Postgis.Wkb.Point      as Point import qualified Database.Esqueleto.Postgis.Wkb.Geospatial as WkbGeospatial+import Data.ByteString.Lazy.Base16(decodeBase16)+import Data.Base16.Types(Base16)  -- | -- Representation of WKB as Binary@@ -31,8 +44,8 @@  -- | -- Representation of WKB as a String in Base16/Hex form i.e. "0101000000000000000000f03f0000000000000040" is POINT 1.0 2.0-parseHexByteString :: Hex.Hex -> Either String Geospatial.GeospatialGeometry-parseHexByteString = Hex.safeConvert parseByteString+parseHexByteString :: Base16 LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry+parseHexByteString = parseByteString . decodeBase16  -- | -- Produce the binary representation of WKB given its EndianType (Little or Big - Intel is Little).  Use EWKB when you know the SRID.
test/Data/SpecHelper.hs view
@@ -12,9 +12,8 @@ import           Test.Hspec                  (Spec, it)  import qualified Database.Esqueleto.Postgis.Ewkb                   as Ewkb-import qualified Database.Esqueleto.Postgis.Ewkb.Geometry as EwkbGeometry-import qualified Database.Esqueleto.Postgis.Wkb.Endian    as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry  as Geometry+import qualified Database.Esqueleto.Postgis.Wkb    as Endian+import qualified Database.Esqueleto.Postgis.Wkb  as Geometry import qualified Database.Esqueleto.Postgis.Wkb                    as Wkb  -- Helpers@@ -47,7 +46,7 @@ roundTripEwkb :: MonadTest m => Endian.EndianType -> Geospatial.GeospatialGeometry -> m () roundTripEwkb endianType geometry =   let-    p = Ewkb.parseByteString . Ewkb.toByteString endianType (EwkbGeometry.Srid (4326 :: Word.Word32))+    p = Ewkb.parseByteString . Ewkb.toByteString endianType (Ewkb.Srid (4326 :: Word.Word32))   in     p geometry === Right geometry 
test/Ewkb/GeometrySpec.hs view
@@ -7,9 +7,9 @@ import qualified Data.Word                   as Word import           Test.Hspec                  (Spec, describe, it, shouldBe) -import qualified Database.Esqueleto.Postgis.Ewkb.Geometry as Ewkb-import qualified Database.Esqueleto.Postgis.Wkb.Endian    as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry  as Wkb+import qualified Database.Esqueleto.Postgis.Ewkb as Ewkb+import qualified Database.Esqueleto.Postgis.Wkb    as Endian+import qualified Database.Esqueleto.Postgis.Wkb  as Wkb  spec :: Spec spec =
test/Test.hs view
@@ -55,7 +55,6 @@ import qualified Wkb.EndianSpec import qualified Wkb.GeometryCollectionSpec import qualified Wkb.GeometrySpec-import qualified Wkb.HexParsingSpec import qualified Wkb.LineSpec import qualified Wkb.PointSpec import qualified Wkb.PolygonSpec@@ -114,7 +113,6 @@     testSpec "Wkb.EndianSpec" Wkb.EndianSpec.spec,     testSpec "Wkb.GeometryCollectionSpec" Wkb.GeometryCollectionSpec.spec,     testSpec "Wkb.GeometrySpec" Wkb.GeometrySpec.spec,-    testSpec "Wkb.HexParsingSpec" Wkb.HexParsingSpec.spec,     testSpec "Wkb.LineSpec" Wkb.LineSpec.spec,     testSpec "Wkb.PointSpec" Wkb.PointSpec.spec,     testSpec "Wkb.PolygonSpec" Wkb.PolygonSpec.spec
test/Wkb/EndianSpec.hs view
@@ -6,7 +6,7 @@ import qualified Data.ByteString.Builder  as ByteStringBuilder import           Test.Hspec               (Spec, describe, it, shouldBe) -import qualified Database.Esqueleto.Postgis.Wkb.Endian as Endian+import qualified Database.Esqueleto.Postgis.Wkb as Endian  spec :: Spec spec =
test/Wkb/GeometrySpec.hs view
@@ -6,8 +6,8 @@ import qualified Data.ByteString.Builder    as ByteStringBuilder import           Test.Hspec                 (Spec, describe, it, shouldBe) -import qualified Database.Esqueleto.Postgis.Wkb.Endian   as Endian-import qualified Database.Esqueleto.Postgis.Wkb.Geometry as Geometry+import qualified Database.Esqueleto.Postgis.Wkb   as Endian+import qualified Database.Esqueleto.Postgis.Wkb as Geometry  spec :: Spec spec =
− test/Wkb/HexParsingSpec.hs
@@ -1,31 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Wkb.HexParsingSpec where--import qualified Data.Geospatial as Geospatial-import           Test.Hspec      (Spec, describe, it, shouldBe)--import qualified Database.Esqueleto.Postgis.Hex        as Hex-import qualified Database.Esqueleto.Postgis.Wkb        as Wkb--spec :: Spec-spec =-  testWkbHexParsing--testWkbHexParsing :: Spec-testWkbHexParsing =-  describe "Test hex encoded wkb point" $ do-    it "Parse valid hex wkb" $-      Wkb.parseHexByteString exampleHexPoint `shouldBe` Right expectedPoint-    it "Not parse valid hex but invalid wkb" $-      Wkb.parseHexByteString (Hex.Hex "deadbeef") `shouldBe` Left "Could not parse wkb: Invalid EndianType"-    it "Some valid, some invalid hex" $-      Wkb.parseHexByteString (Hex.Hex "deadfish") `shouldBe` Left "Invalid hex representation: deadfish"-    it "All bad" $-      Wkb.parseHexByteString (Hex.Hex "cowboyx") `shouldBe` Left "Invalid hex representation: cowboyx"--exampleHexPoint :: Hex.Hex-exampleHexPoint = Hex.Hex "0101000000000000000000f03f0000000000000040"--expectedPoint :: Geospatial.GeospatialGeometry-expectedPoint = Geospatial.Point (Geospatial.GeoPoint (Geospatial.GeoPointXY (Geospatial.PointXY 1.0 2.0)))
test/Wkb/PointSpec.hs view
@@ -9,8 +9,8 @@ import           Hedgehog import           Test.Hspec                  (Spec, describe, it) -import qualified Database.Esqueleto.Postgis.Wkb.Geometry  as Geometry-import qualified Database.Esqueleto.Postgis.Wkb.Point     as Point+import qualified Database.Esqueleto.Postgis.Wkb  as Geometry+import qualified Database.Esqueleto.Postgis.Wkb     as Point import qualified Data.SpecHelper             as SpecHelper  spec :: Spec