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