servant/servant-docs
Nicolas BACQUEY 0a1d32d21e Refactor NoContentVerb into NoContentVerbWithStatus (#1532)
There are several HTTP status codes that correspond to a response body
with `NoContent`. This commit introduces `NoContentVerbWithStatus` which
generalizes `NoContentVerb` to cases when the return status may be
different from 204. The former replaces the latter anywhere possible.

`NoContentVerb` is kept as a special case of `NoContentVerbWithStatus`
for backwards compatibility.
2022-03-03 17:00:20 +01:00
..
example Servant docs curl (#1401) 2021-08-19 13:11:00 +02:00
golden use Capture Description if available (#1423) 2021-06-08 13:28:19 -05:00
src/Servant Refactor NoContentVerb into NoContentVerbWithStatus (#1532) 2022-03-03 17:00:20 +01:00
test Servant docs curl (#1401) 2021-08-19 13:11:00 +02:00
.ghci servant-docs: add .ghci 2016-01-18 12:28:29 +01:00
CHANGELOG.md Changelog tweaks + servant-http-streams / servant-docs bump 2022-02-01 12:29:31 +01:00
docs.sh prepare merge 2015-04-20 11:19:48 +02:00
LICENSE Changelog and cabal file edits 2018-11-13 09:58:42 +02:00
README.md Fix servant-docs code sample in README (#1335) 2020-09-03 06:43:10 +02:00
servant-docs.cabal Allow newer hashable, lens, text 2022-02-06 16:12:25 -06:00
Setup.hs stylish haskell changes 2015-08-18 00:07:12 +02:00

servant-docs

servant

Generate API docs for your servant webservice. Feel free to also take a look at servant-pandoc which uses this package to target a broad range of output formats using the excellent pandoc.

Example

See here for the output of the following program.

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

import Data.Aeson (FromJSON, ToJSON)
import Data.Proxy (Proxy (..))
import Data.String.Conversions (cs)
import Data.Text (Text)
import GHC.Generics (Generic)
import Servant.API
  ( (:<|>),
    (:>),
    Capture,
    Delete,
    Get,
    JSON,
    MimeRender,
    PlainText,
    Post,
    QueryParam,
    ReqBody,
    mimeRender,
  )
import Servant.Docs
  ( API,
    DocCapture (..),
    DocQueryParam (..),
    ParamKind (..),
    ToCapture,
    ToParam,
    ToSample,
    docs,
    markdown,
    singleSample,
    toCapture,
    toParam,
    toSamples,
  )

-- our type for a Greeting message
data Greet = Greet { _msg :: Text }
  deriving (Generic, Show)

-- we get our JSON serialization for free. This will be used by the default
-- 'MimeRender' instance for 'JSON'.
instance FromJSON Greet
instance ToJSON Greet
instance ToSample ()

-- We can also implement 'MimeRender' explicitly for additional formats.
instance MimeRender PlainText Greet where
    mimeRender Proxy (Greet s) = "<h1>" <> cs s <> "</h1>"

-- we provide a sample value for the 'Greet' type
instance ToSample Greet where
  toSamples _ = singleSample g
    where g = Greet "Hello, haskeller!"

instance ToParam (QueryParam "capital" Bool) where
  toParam _ =
    DocQueryParam "capital"
                  ["true", "false"]
                  "Get the greeting message in uppercase (true) or not (false). Default is false."
                  Normal

instance ToCapture (Capture "name" Text) where
  toCapture _ = DocCapture "name" "name of the person to greet"

instance ToCapture (Capture "greetid" Text) where
  toCapture _ = DocCapture "greetid" "identifier of the greet msg to remove"

-- API specification
type TestApi =
       "hello" :> Capture "name" Text :> QueryParam "capital" Bool :> Get '[JSON,PlainText] Greet
  :<|> "greet" :> ReqBody '[JSON] Greet :> Post '[JSON] Greet
  :<|> "delete" :> Capture "greetid" Text :> Delete '[JSON] ()

testApi :: Proxy TestApi
testApi = Proxy

-- Generate the Documentation's ADT
greetDocs :: API
greetDocs = docs testApi

main :: IO ()
main = putStrLn $ markdown greetDocs