module Data.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 :: (ByteString -> Either String GeospatialGeometry)
-> Hex -> Either String GeospatialGeometry
safeConvert ByteString -> Either String GeospatialGeometry
f (Hex ByteString
byteString) =
    case ByteString -> Either String ByteString
ByteStringBase16.decode ByteString
byteString of
         Left  String
_       -> String -> Either String GeospatialGeometry
forall a b. a -> Either a b
Left (String -> Either String GeospatialGeometry)
-> String -> Either String GeospatialGeometry
forall a b. (a -> b) -> a -> b
$ String
"Invalid hex representation: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ByteString -> String
ByteStringChar8.unpack ByteString
byteString
         Right ByteString
decoded -> ByteString -> Either String GeospatialGeometry
f    (ByteString -> Either String GeospatialGeometry)
-> ByteString -> Either String GeospatialGeometry
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
LazyByteString.fromStrict ByteString
decoded