{-# 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
<//> :: Path as 'Open -> Path bs ps -> Path (Append as bs) ps
(<//>) = Path as 'Open -> Path bs ps -> Path (Append as bs) ps
forall (as :: [*]) (bs :: [*]) (ps2 :: PathState).
Path as 'Open -> Path bs ps2 -> Path (Append as bs) ps2
(</>)

-- | 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