{-# LANGUAGE TemplateHaskell #-} {-| Module: IHP.Postgres.Interval Description: Adds support for the Postgres Interval type Copyright: (c) digitally induced GmbH, 2020 -} module IHP.Postgres.Interval where import BasicPrelude import Database.PostgreSQL.Simple.ToField import Database.PostgreSQL.Simple.FromField import qualified Database.PostgreSQL.Simple.TypeInfo.Static as TI import Database.PostgreSQL.Simple.TypeInfo.Macro as TI import Data.Attoparsec.ByteString.Char8 as Attoparsec import Data.Aeson import IHP.Postgres.TimeParser (PGInterval(..)) import qualified Data.Text.Encoding as Text instance FromField PGInterval where fromField f v = if typeOid f /= $(inlineTypoid TI.interval) then returnError Incompatible f "" else case v of Nothing -> returnError UnexpectedNull f "" Just bs -> case parseOnly pPGInterval bs of Left err -> returnError ConversionFailed f err Right val -> pure val pPGInterval = do bs <- takeByteString pure (PGInterval bs) instance ToField PGInterval where toField (PGInterval interval) = toField (interval) instance FromJSON PGInterval where parseJSON = withText "PGInterval" $ \text -> pure (PGInterval (encodeUtf8 text)) instance ToJSON PGInterval where toJSON (PGInterval pgInterval) = String (Text.decodeUtf8 pgInterval)