{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Database.Ribbit.Insert (
InsertInto,
) where
import Database.Ribbit.Render (Render)
import Database.Ribbit.Table (Name)
import GHC.TypeLits (AppendSymbol)
data InsertInto table fields
type instance Render (InsertInto table fields) =
"insert into "
`AppendSymbol` Name table
`AppendSymbol` " ("
`AppendSymbol` RendFieldList fields
`AppendSymbol`") values ("
`AppendSymbol` RendPlaceholderList fields
`AppendSymbol` ");"
type family RendFieldList a where
RendFieldList '[field] = field
RendFieldList (f1:f2:more) =
f1
`AppendSymbol` ", "
`AppendSymbol` RendFieldList (f2:more)
type family RendPlaceholderList a where
RendPlaceholderList '[field] = "?"
RendPlaceholderList (f1:f2:more) =
"?"
`AppendSymbol` ", "
`AppendSymbol` RendPlaceholderList (f2:more)