{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Database.Ribbit.Params (
ParamsType,
ResultType,
ParamsTypeSchema,
ProjectionType,
) where
import Data.Tuple.Only (Only)
import Database.Ribbit.Table ((:>), Field, NotInSchema)
type family ParamsType query
type family ResultType query
type family ParamsTypeSchema schema a
type family ProjectionType proj schema where
ProjectionType '[name] schema =
LookupType name schema schema
ProjectionType (name:more) schema =
LookupType name schema schema
:> ProjectionType more schema
type family LookupType name schema context where
LookupType name (Field name typ) _ = Only typ
LookupType name (Field name typ :> _) _ = Only typ
LookupType name (Field _ typ) context = NotInSchema name context
LookupType name (_ :> more) context = LookupType name more context
LookupType name a context = NotInSchema name context