packages feed

hasql-mapping-0.1.0.1: src/library/Hasql/Mapping/IsScalar.hs

module Hasql.Mapping.IsScalar where

import qualified Data.Aeson as Aeson
import Data.ByteString (ByteString)
import Data.Functor.Contravariant ((>$<))
import Data.IP (IPRange)
import Data.Int (Int16, Int32, Int64)
import Data.Scientific (Scientific)
import Data.Text (Text)
import Data.Time (Day, DiffTime, LocalTime, TimeOfDay, TimeZone, UTCTime)
import Data.UUID (UUID)
import Data.Word (Word8)
import qualified Hasql.Decoders as Decoders
import qualified Hasql.Encoders as Encoders
import Prelude

-- | Mapping to a scalar value. Anything but array.
--
-- The current Hasql API doesn't provide a typesafe boundary to enforce the value being scalar,
-- so consider this to be a part of the contract to not define instances for array mappings using this class.
class IsScalar a where
  encoder :: Encoders.Value a
  decoder :: Decoders.Value a

-- | Maps to PostgreSQL @bool@.
instance IsScalar Bool where
  encoder = Encoders.bool
  decoder = Decoders.bool

-- | Maps to PostgreSQL @int2@.
instance IsScalar Int16 where
  encoder = Encoders.int2
  decoder = Decoders.int2

-- | Maps to PostgreSQL @int4@.
instance IsScalar Int32 where
  encoder = Encoders.int4
  decoder = Decoders.int4

-- | Maps to PostgreSQL @int8@.
instance IsScalar Int64 where
  encoder = Encoders.int8
  decoder = Decoders.int8

-- | Maps to PostgreSQL @int8@.
instance IsScalar Int where
  encoder = fromIntegral >$< Encoders.int8
  decoder = fromIntegral <$> Decoders.int8

-- | Maps to PostgreSQL @float4@.
instance IsScalar Float where
  encoder = Encoders.float4
  decoder = Decoders.float4

-- | Maps to PostgreSQL @float8@.
instance IsScalar Double where
  encoder = Encoders.float8
  decoder = Decoders.float8

-- | Maps to PostgreSQL @numeric@.
instance IsScalar Scientific where
  encoder = Encoders.numeric
  decoder = Decoders.numeric

-- | Maps to PostgreSQL @text@.
instance IsScalar Text where
  encoder = Encoders.text
  decoder = Decoders.text

-- | Maps to PostgreSQL @bytea@.
instance IsScalar ByteString where
  encoder = Encoders.bytea
  decoder = Decoders.bytea

-- | Maps to PostgreSQL @date@.
instance IsScalar Day where
  encoder = Encoders.date
  decoder = Decoders.date

-- | Maps to PostgreSQL @timestamp@.
instance IsScalar LocalTime where
  encoder = Encoders.timestamp
  decoder = Decoders.timestamp

-- | Maps to PostgreSQL @timestamptz@.
instance IsScalar UTCTime where
  encoder = Encoders.timestamptz
  decoder = Decoders.timestamptz

-- | Maps to PostgreSQL @time@.
instance IsScalar TimeOfDay where
  encoder = Encoders.time
  decoder = Decoders.time

-- | Maps to PostgreSQL @timetz@.
instance IsScalar (TimeOfDay, TimeZone) where
  encoder = Encoders.timetz
  decoder = Decoders.timetz

-- | Maps to PostgreSQL @interval@.
instance IsScalar DiffTime where
  encoder = Encoders.interval
  decoder = Decoders.interval

-- | Maps to PostgreSQL @uuid@.
instance IsScalar UUID where
  encoder = Encoders.uuid
  decoder = Decoders.uuid

-- | Maps to PostgreSQL @inet@.
instance IsScalar IPRange where
  encoder = Encoders.inet
  decoder = Decoders.inet

-- | Maps to PostgreSQL @macaddr@.
instance IsScalar (Word8, Word8, Word8, Word8, Word8, Word8) where
  encoder = Encoders.macaddr
  decoder = Decoders.macaddr

-- | Maps to PostgreSQL @jsonb@.
instance IsScalar Aeson.Value where
  encoder = Encoders.jsonb
  decoder = Decoders.jsonb