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
import           Data.Monoid            ((<>))

newtype Hex = Hex ByteString.ByteString

safeConvert :: (LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry) -> Hex -> Either String Geospatial.GeospatialGeometry
safeConvert f (Hex byteString) =
  let
    (decoded, rest) = ByteStringBase16.decode byteString
  in
    if ByteString.null rest then
      f $ LazyByteString.fromStrict decoded
    else
      Left ("Invalid hex representation: " <> ByteStringChar8.unpack byteString)