Add unit tests and reimplement FromField
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
|
||||
module Database.PostgreSQL.Opium.FromField (FromField (..)) where
|
||||
|
||||
import Data.Attoparsec.Text
|
||||
( Parser
|
||||
, decimal
|
||||
, parseOnly
|
||||
, signed
|
||||
)
|
||||
import Data.Text (Text)
|
||||
import Database.PostgreSQL.LibPQ (Oid)
|
||||
|
||||
import qualified Data.Text as Text
|
||||
import qualified Database.PostgreSQL.Opium.Oid as Oid
|
||||
|
||||
(\/) :: (a -> Bool) -> (a -> Bool) -> a -> Bool
|
||||
p \/ q = \x -> p x || q x
|
||||
|
||||
eitherToMaybe :: Either b a -> Maybe a
|
||||
eitherToMaybe = \case
|
||||
Left _ -> Nothing
|
||||
Right x -> Just x
|
||||
|
||||
fromParser
|
||||
:: (Oid -> Bool)
|
||||
-> Parser a
|
||||
-> Oid
|
||||
-> Text
|
||||
-> Maybe a
|
||||
fromParser validOid parser oid value
|
||||
| validOid oid = eitherToMaybe $ parseOnly parser value
|
||||
| otherwise = Nothing
|
||||
|
||||
class FromField a where
|
||||
fromField :: Oid -> Text -> Maybe a
|
||||
|
||||
instance FromField Int where
|
||||
fromField = fromParser
|
||||
(Oid.smallint \/ Oid.integer \/ Oid.bigint)
|
||||
(signed decimal)
|
||||
|
||||
instance FromField Text where
|
||||
fromField oid text =
|
||||
if Oid.text oid || Oid.character oid || Oid.characterVarying oid then
|
||||
Just text
|
||||
else
|
||||
Nothing
|
||||
|
||||
instance FromField String where
|
||||
fromField oid text = Text.unpack <$> fromField oid text
|
||||
@@ -0,0 +1,31 @@
|
||||
module Database.PostgreSQL.Opium.Oid where
|
||||
|
||||
import Database.PostgreSQL.LibPQ (Oid (..))
|
||||
|
||||
eq :: Eq a => a -> a -> Bool
|
||||
eq = (==)
|
||||
|
||||
-- integer types
|
||||
|
||||
-- | 16-bit integer
|
||||
smallint :: Oid -> Bool
|
||||
smallint = eq $ Oid 21
|
||||
|
||||
-- | 32-bit integer
|
||||
integer :: Oid -> Bool
|
||||
integer = eq $ Oid 23
|
||||
|
||||
-- | 64-bit integer
|
||||
bigint :: Oid -> Bool
|
||||
bigint = eq $ Oid 20
|
||||
|
||||
-- string types
|
||||
|
||||
text :: Oid -> Bool
|
||||
text = eq $ Oid 25
|
||||
|
||||
character :: Oid -> Bool
|
||||
character = eq $ Oid 1042
|
||||
|
||||
characterVarying :: Oid -> Bool
|
||||
characterVarying = eq $ Oid 1043
|
||||
Reference in New Issue
Block a user