-- | All the traits supported by WebGear.
module WebGear.Core.Traits (
  module WebGear.Core.Trait.Auth.Basic,
  module WebGear.Core.Trait.Auth.JWT,
  module WebGear.Core.Trait.Auth.Common,
  module WebGear.Core.Trait.Body,
  module WebGear.Core.Trait.Cookie,
  module WebGear.Core.Trait.Header,
  module WebGear.Core.Trait.Method,
  module WebGear.Core.Trait.Path,
  module WebGear.Core.Trait.QueryParam,
  module WebGear.Core.Trait.Status,
  StdHandler,
) where

import qualified Data.Text as Text
import qualified Data.Text.Lazy as LText
import WebGear.Core.Handler (Handler)
import WebGear.Core.MIMETypes (PlainText)
import WebGear.Core.Request (Request)
import WebGear.Core.Response (Response)
import WebGear.Core.Trait (Gets, Sets)
import WebGear.Core.Trait.Auth.Basic
import WebGear.Core.Trait.Auth.Common
import WebGear.Core.Trait.Auth.JWT
import WebGear.Core.Trait.Body
import WebGear.Core.Trait.Cookie
import WebGear.Core.Trait.Header
import WebGear.Core.Trait.Method
import WebGear.Core.Trait.Path
import WebGear.Core.Trait.QueryParam
import WebGear.Core.Trait.Status

{- | Constraints that include a set of common traits for handlers.

 The type variables are:

 * @h@ - The handler arrow
 * @m@ - The underlying monad of the handler
-}
type StdHandler h m =
  ( Handler h m
  , Gets h [Method, Path, PathEnd] Request
  , Sets
      h
      '[ Status
       , Body PlainText String
       , Body PlainText Text.Text
       , Body PlainText LText.Text
       ]
      Response
  )