packages feed

acolyte-server-0.1.0.0: src/Acolyte/Server.hs

-- | @acolyte-server@ — HTTP server interpretation.
--
-- Interprets acolyte-core API types into a spire Service.
-- Combine with spire-wai to run on warp.
--
-- @
-- import Acolyte.Core
-- import Acolyte.Server
-- import Spire.Wai (runWarp)
--
-- type API = '[ Get '[ Lit "hello" ] Text ]
--
-- main :: IO ()
-- main = do
--   let svc = serve router
--   runWarp 3000 svc
-- @
module Acolyte.Server
  ( -- * Extractors
    FromRequestParts (..)
  , FromRequest (..)
  , PathCapture (..)
  , JsonBody (..)
  , ValidatedBody (..)
  , AppState (..)
  , RawBody (..)
  , ReqHeader (..)
  , Extension (..)
  , Optional (..)
  , ReqMethod (..)
  , QueryParam (..)
  , QueryParams (..)
  , OptionalParam (..)
  , HeaderMap (..)
  , BodyBytes (..)
  , StringBody (..)
  , Form (..)
  , FromForm (..)
  , RawForm (..)
  , Multipart (..)
  , FilePart (..)
  , parseFormUrlEncoded
  , parseMultipart
  , FullRequest (..)
  , RawQuery (..)
  , OriginalUri (..)
  , MatchedPath (..)
  , NestedPath (..)
  , ConnectInfo (..)
  , RawPathParams (..)
  , ParseCapture (..)
  , ServerError (..)
  , mkError

    -- * Responses
  , IntoResponse (..)
  , Json (..)
  , JsonError (..)
  , jsonError

    -- * Handler binding
  , BoundHandler (..)
  , HandlerFn
  , MatchResult (..)
  , HasEndpointInfo (..)
  , ReflectPath (..)
  , mkHandler0
  , mkHandler1Parts
  , mkHandler1Body
  , mkHandler2PartsBody

    -- * Ergonomic handler conversion
  , ToHandler (..)

    -- * Router (low-level)
  , Router
  , emptyRouter
  , addRoute
  , dispatch
  , serve
  , serveWithState
  , CaptureList (..)
  , injectCaptures

    -- * Automatic wiring (high-level)
  , mkServer
  , mkServerWith
  , WrappedHandler (..)
  , wrapHandler
  , handle
  , BuildServer (..)
  , BuildHandlers (..)

    -- * Ergonomic server construction (no wrapHandler needed)
  , mkApi
  , BuildApi (..)
  , toBoundHandler

    -- * Effectful server (typed middleware tracking)
  , EffectfulServer (..)
  , effectfulServer
  , effectfulApi
  , fromRouter
  , provide
  , run

    -- * Sub-API composition (for APIs > 25 endpoints)
  , combineServer2
  , combineServer3
  , combineServer4
  , combineServer5
  , combineServer6
  , combineServer7
  , combineServer8
  , subRouter

    -- * Combined effectful server (backward-compatible aliases)
  , CombinedServer
  , combinedFromRouter
  , provideEffect
  , runCombined

    -- * Named routes (record-based handler registration)
  , NamedApi (..)
  , mkNamedApi
  , effectfulNamedApi
    -- * Automatic record-based handler binding (requires Named wrappers)
  , BuildRecordApi (..)
  , mkRecordApi
  , effectfulRecordApi

    -- * Content negotiation
  , FormatEncoder (..)
  , NegotiatedResponse (..)
  , negotiate
  , parseAccept
  , matchFormat

    -- * Runtime validation
  , validationLayer
  , BuildRouteTable (..)

    -- * Streaming support
  , SSEvent (..)
  , sseEvent
  , sseData
  , ServerStreamHandler
  , ClientStreamHandler
  , BidiStreamHandler
  , sseResponse
  , sseResponseSync
  , sseChunk
  ) where

import Acolyte.Server.Extract
import Acolyte.Server.Response
import Acolyte.Server.Handler
import Acolyte.Server.Router
import Acolyte.Server.Wiring
import Acolyte.Server.Effects
import Acolyte.Server.Combine
import Acolyte.Server.CombineEffects
import Acolyte.Server.Validate
import Acolyte.Server.ToHandler
import Acolyte.Server.MkApi
import Acolyte.Server.Named
import Acolyte.Server.Negotiate
import Acolyte.Server.Streaming