content: {-# 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)
  