module Aws.Lambda.Meta.Run
  ( generate
  ) where

import qualified Language.Haskell.TH as Meta

import Aws.Lambda.Meta.Common
import qualified Aws.Lambda.Meta.Discover as Discover
import qualified Aws.Lambda.Meta.Dispatch as Dispatch
import qualified Aws.Lambda.Meta.Main as Main

generate :: Main.DispatcherOptions -> Main.DispatcherStrategy -> Meta.DecQ
generate options strategy = do
  handlers <- Meta.runIO Discover.handlers
  clause' <- getFieldsFrom "LambdaOptions" ["functionHandler", "contextObject", "eventObject", "executionUuid"]
  body <- Dispatch.generate options strategy handlers
  pure $ Meta.FunD (Meta.mkName "run") [Meta.Clause [clause'] (Meta.NormalB body) []]