module Arbiter.Hasql.Decode
  ( hasqlRowDecoder
  ) where

import Arbiter.Core.Codec (Col (..), NullCol (..), RowCodec, runCodec)
import Hasql.Decoders qualified as D

hasqlRowDecoder :: RowCodec a -> D.Result [a]
hasqlRowDecoder :: forall a. RowCodec a -> Result [a]
hasqlRowDecoder RowCodec a
codec = Row a -> Result [a]
forall a. Row a -> Result [a]
D.rowList ((forall x. NullCol x -> Row x) -> RowCodec a -> Row a
forall (f :: * -> *) a.
Applicative f =>
(forall x. NullCol x -> f x) -> RowCodec a -> f a
runCodec NullCol x -> Row x
forall x. NullCol x -> Row x
interpretCol RowCodec a
codec)

interpretCol :: NullCol a -> D.Row a
interpretCol :: forall x. NullCol x -> Row x
interpretCol (NotNull Text
_ Col a
c) = NullableOrNot Value a -> Row a
forall a. NullableOrNot Value a -> Row a
D.column (Value a -> NullableOrNot Value a
forall (decoder :: * -> *) a. decoder a -> NullableOrNot decoder a
D.nonNullable (Col a -> Value a
forall a. Col a -> Value a
colValue Col a
c))
interpretCol (Nullable Text
_ Col a1
c) = NullableOrNot Value a -> Row a
forall a. NullableOrNot Value a -> Row a
D.column (Value a1 -> NullableOrNot Value (Maybe a1)
forall (decoder :: * -> *) a.
decoder a -> NullableOrNot decoder (Maybe a)
D.nullable (Col a1 -> Value a1
forall a. Col a -> Value a
colValue Col a1
c))

colValue :: Col a -> D.Value a
colValue :: forall a. Col a -> Value a
colValue Col a
CInt4 = Value a
Value Int32
D.int4
colValue Col a
CInt8 = Value a
Value Int64
D.int8
colValue Col a
CText = Value a
Value Text
D.text
colValue Col a
CBool = Value a
Value Bool
D.bool
colValue Col a
CTimestamptz = Value a
Value UTCTime
D.timestamptz
colValue Col a
CJsonb = Value a
Value Value
D.jsonb
colValue Col a
CFloat8 = Value a
Value Double
D.float8