module Sqel.Data.TableSchema where

import Exon (exon)
import Hasql.Decoders (Row)
import Hasql.Encoders (Params)
import Lens.Micro ((^.))

import Sqel.Data.PgType (PgTable)
import Sqel.Data.Sql (ToSql (toSql))
import Sqel.Data.SqlFragment (Create (Create), Select (Select))

data TableSchema a =
  TableSchema {
    forall a. TableSchema a -> PgTable a
pg :: PgTable a,
    forall a. TableSchema a -> Row a
decoder :: Row a,
    forall a. TableSchema a -> Params a
encoder :: Params a
  }
  deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (TableSchema a) x -> TableSchema a
forall a x. TableSchema a -> Rep (TableSchema a) x
$cto :: forall a x. Rep (TableSchema a) x -> TableSchema a
$cfrom :: forall a x. TableSchema a -> Rep (TableSchema a) x
Generic)

instance Show (TableSchema a) where
  showsPrec :: Int -> TableSchema a -> ShowS
showsPrec Int
d TableSchema {PgTable a
pg :: PgTable a
$sel:pg:TableSchema :: forall a. TableSchema a -> PgTable a
pg} =
    Bool -> ShowS -> ShowS
showParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
10) [exon|TableSchema #{showsPrec 11 pg}|]

instance ToSql (Select (TableSchema a)) where
  toSql :: Select (TableSchema a) -> Sql
toSql (Select TableSchema a
ts) =
    forall a. ToSql a => a -> Sql
toSql (forall a. a -> Select a
Select (TableSchema a
ts forall s a. s -> Getting a s a -> a
^. forall a. IsLabel "pg" a => a
#pg))

instance ToSql (Create (TableSchema a)) where
  toSql :: Create (TableSchema a) -> Sql
toSql (Create TableSchema a
ts) =
    forall a. ToSql a => a -> Sql
toSql (forall a. a -> Create a
Create (TableSchema a
ts forall s a. s -> Getting a s a -> a
^. forall a. IsLabel "pg" a => a
#pg))