-- | Module for common re-exports
module Mig.Extra.Server.Common (
  -- * types
  Server (..),
  Api (..),
  Path (..),
  PathItem (..),
  Route (..),

  -- * DSL
  Json,
  AnyMedia,
  OctetStream,
  FormUrlEncoded,
  ToServer (..),
  ToRoute (..),
  MediaType,
  ToMediaType (..),
  ToRespBody (..),

  -- ** response
  IsResp (..),
  badReq,
  internalServerError,
  notImplemented,
  redirect,
  setHeader,
  setCookie,
  SetCookie (..),
  defCookie,

  -- ** methods
  Send (..),
  IsMethod (..),
  GET,
  POST,
  PUT,
  DELETE,
  PATCH,
  OPTIONS,
  HEAD,
  TRACE,

  -- ** safe URLs
  UrlOf,
  ToUrl (..),
  Url (..),
  renderUrl,
  (:|) (..),

  -- ** path and query

  -- | Build API for routes with queries and captures.
  -- Use monoid to combine several routes together.
  (/.),
  Capture (..),
  Query (..),
  QueryFlag (..),
  Optional (..),
  Header (..),
  OptionalHeader (..),
  Cookie (..),
  PathInfo (..),
  FullPathInfo (..),
  RawRequest (..),

  -- ** response

  -- | How to modify response and attach specific info to it

  -- ** specific cases
  staticFiles,

  -- ** Plugins
  Plugin (..),
  PluginFun,
  ToPlugin (..),
  applyPlugin,
  ($:),
  prependServerAction,
  appendServerAction,
  processResponse,

  -- ** Low-level types
  Request,
  Response,
  okResponse,
  badResponse,
  badRequest,
  ServerFun,

  -- ** Render

  -- | Render Reader-IO monad servers to IO servers.
  HasServer (..),
  fromReader,

  -- * Convertes
  ToText (..),

  -- ** Server
  mapRouteInfo,
  mapServerFun,
  mapResponse,
  atPath,
  filterPath,
  getServerPaths,
  addPathLink,

  -- ** OpenApi
  toOpenApi,
  setDescription,
  describeInputs,
  setSummary,
  module X,
) where

import Mig.Core hiding (
  Delete,
  Get,
  Head,
  Options,
  Patch,
  Post,
  Put,
  Resp,
  RespOr,
  Trace,
 )

-- common codecs and types

import Control.Monad.IO.Class as X
import Control.Monad.Trans.Class as X
import Data.Aeson as X (FromJSON (..), ToJSON (..))
import Data.Default as X
import Data.Maybe as X
import Data.OpenApi as X (OpenApi, ToParamSchema (..), ToSchema (..))
import Data.String as X
import Data.Text as X (Text)
import GHC.Generics as X (Generic)
import Mig.Extra.Derive as X
import Network.HTTP.Types.Header as X (RequestHeaders, ResponseHeaders)
import Network.HTTP.Types.Status as X
import Text.Blaze.Html as X (Html, ToMarkup (..))
import Web.FormUrlEncoded as X
import Web.HttpApiData as X