{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Registry.Hedgehog.TH where
import Control.Monad.Fail (fail)
import Data.Registry.Internal.TH
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Protolude
makeGenerators :: Name -> ExpQ
makeGenerators genType = do
info <- reify genType
case info of
TyConI (DataD _context name _typeVars _kind constructors _deriving) -> do
selector <- makeSelectGenerator name constructors
generators <- traverse makeConstructorGenerator constructors
assembleGeneratorsToRegistry selector generators
other -> do
qReport True ("can only create generators for an ADT, got: " <> show other)
fail "generators creation failed"