{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} module Internal.Data.Basic.SqlToHsTypes where import Internal.Interlude import Prelude (lex) import Database.PostgreSQL.Simple.FromField import qualified Database.PostgreSQL.Simple.TypeInfo.Static as TypeId import qualified Data.ByteString.Char8 as B import Database.PostgreSQL.Simple.ToField import Data.Binary.Builder import GHC.Generics data Point = Point {-# UNPACK #-} !Double {-# UNPACK #-} !Double deriving (Eq, Read, Show, Generic, ToJSON, FromJSON) instance FromField Point where fromField f mdata = if typeOid f /= TypeId.typoid TypeId.point then returnError Incompatible f "" else case B.unpack <$> mdata of Nothing -> returnError UnexpectedNull f "" Just dat -> case [ x | (x,t) <- reads dat, ("","") <- lex t ] of [(x, y)] -> return (Point x y) _ -> returnError ConversionFailed f dat instance ToField Point where toField (Point x y) = Plain (fromByteString bs) where bs = "point(" <> show x <> ", " <> show y <> ")"