content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE GADTs #-}
  {-# LANGUAGE KindSignatures #-}
  {-# LANGUAGE TypeFamilies #-}
  
  module Web.Spock.Api
    ( Endpoint (..),
      Proxy (..),
      MaybeToList,
      (<//>),
      var,
      Path (..),
      renderRoute,
      Generic,
      ToJSON,
      FromJSON,
      NFData,
      Typeable,
    )
  where
  
  import Control.DeepSeq
  import Data.Aeson
  import Data.HVect
  import Data.Proxy
  import Data.Typeable
  import GHC.Generics
  import Web.Routing.Combinators
  
  (<//>) :: Path as 'Open -> Path bs ps -> Path (Append as bs) ps
  (<//>) = (</>)
  
  -- | Describes an endpoint with path parameters, an optional json body and a json response
  data Endpoint (p :: [*]) (i :: Maybe *) (o :: *) where
    MethodGet :: (ToJSON o, FromJSON o) => Path p 'Open -> Endpoint p 'Nothing o
    MethodPost ::
      (ToJSON i, FromJSON i, ToJSON o, FromJSON o) =>
      Proxy (i -> o) ->
      Path p 'Open ->
      Endpoint p ('Just i) o
    MethodPut ::
      (ToJSON i, FromJSON i, ToJSON o, FromJSON o) =>
      Proxy (i -> o) ->
      Path p 'Open ->
      Endpoint p ('Just i) o
  