@@ -142,6 +142,8 @@ import qualified Data.ByteString.Lazy as LB
142142import qualified Data.Text as ST
143143import qualified Data.Text.Encoding as ST
144144import qualified Data.Text.Lazy as LT
145+import Data.CaseInsensitive (CI)
146+import qualified Data.CaseInsensitive as CI
145147import Data.UUID (UUID)
146148import qualified Data.UUID as UUID
147149import Data.Scientific (Scientific)
@@ -397,6 +399,28 @@ instance FromField ST.Text where
397399instance FromField LT.Text where
398400 fromField f dat = LT.fromStrict <$> fromField f dat
399401
402+-- | citext
403+instance FromField (CI ST.Text) where
404+ fromField f mdat = do
405+ typ <- typename f
406+ if typ /= "citext"
407+ then returnError Incompatible f ""
408+ else case mdat of
409+ Nothing -> returnError UnexpectedNull f ""
410+ Just dat -> either left (pure . CI.mk)
411+ (ST.decodeUtf8' dat)
412+
413+-- | citext
414+instance FromField (CI LT.Text) where
415+ fromField f mdat = do
416+ typ <- typename f
417+ if typ /= "citext"
418+ then returnError Incompatible f ""
419+ else case mdat of
420+ Nothing -> returnError UnexpectedNull f ""
421+ Just dat -> either left (pure . CI.mk . LT.fromStrict)
422+ (ST.decodeUtf8' dat)
423+
400424-- | name, text, \"char\", bpchar, varchar
401425instance FromField [Char] where
402426 fromField f dat = ST.unpack <$> fromField f dat