module Sqel.Data.QuerySchema where

import Sqel.Data.Codec (Encoder)
import Sqel.Data.SelectExpr (SelectFragment)
import Sqel.Data.Sql (ToSql (toSql))
import Sqel.Data.SqlFragment (SelectQuery (SelectQuery))

data QuerySchema q a =
  QuerySchema {
    forall {k} q (a :: k). QuerySchema q a -> [SelectFragment]
frags :: [SelectFragment],
    forall {k} q (a :: k). QuerySchema q a -> Encoder q
encoder :: Encoder q
  }
  deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall q k (a :: k) x. Rep (QuerySchema q a) x -> QuerySchema q a
forall q k (a :: k) x. QuerySchema q a -> Rep (QuerySchema q a) x
$cto :: forall q k (a :: k) x. Rep (QuerySchema q a) x -> QuerySchema q a
$cfrom :: forall q k (a :: k) x. QuerySchema q a -> Rep (QuerySchema q a) x
Generic)

emptyQuerySchema :: QuerySchema () a
emptyQuerySchema :: forall {k} (a :: k). QuerySchema () a
emptyQuerySchema =
  forall {k} q (a :: k).
[SelectFragment] -> Encoder q -> QuerySchema q a
QuerySchema forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty

instance ToSql (SelectQuery (QuerySchema q a)) where
  toSql :: SelectQuery (QuerySchema q a) -> Sql
toSql (SelectQuery (QuerySchema [SelectFragment]
frags Encoder q
_)) =
    forall a. ToSql a => a -> Sql
toSql [SelectFragment]
frags