2014-12-08 11:25:52 +01:00
# servant-docs
![servant ](https://raw.githubusercontent.com/haskell-servant/servant/master/servant.png )
2020-09-03 06:43:10 +02:00
Generate API docs for your _servant_ webservice. Feel free to also take a look at [servant-pandoc ](https://github.com/mpickering/servant-pandoc ) which uses this package to target a broad range of output formats using the excellent **pandoc** .
2014-12-08 11:25:52 +01:00
## Example
2015-12-19 01:56:37 +01:00
See [here ](https://github.com/haskell-servant/servant/blob/master/servant-docs/example/greet.md ) for the output of the following program.
2014-12-08 11:25:52 +01:00
2020-09-03 06:43:10 +02:00
```haskell
2014-12-08 11:25:52 +01:00
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
2020-09-03 06:43:10 +02:00
{-# LANGUAGE MultiParamTypeClasses #-}
2014-12-08 11:25:52 +01:00
{-# LANGUAGE OverloadedStrings #-}
2020-09-03 06:43:10 +02:00
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
2014-12-08 11:25:52 +01:00
2020-09-03 06:43:10 +02:00
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,
)
2017-04-07 02:33:22 +02:00
import Servant.Docs
2020-09-03 06:43:10 +02:00
( API,
DocCapture (..),
DocQueryParam (..),
ParamKind (..),
ToCapture,
ToParam,
ToSample,
docs,
markdown,
singleSample,
toCapture,
toParam,
toSamples,
)
2014-12-08 11:25:52 +01:00
-- our type for a Greeting message
data Greet = Greet { _msg :: Text }
deriving (Generic, Show)
2015-02-22 09:42:38 +01:00
-- we get our JSON serialization for free. This will be used by the default
-- 'MimeRender' instance for 'JSON'.
2014-12-08 11:25:52 +01:00
instance FromJSON Greet
instance ToJSON Greet
2020-09-03 06:43:10 +02:00
instance ToSample ()
2014-12-08 11:25:52 +01:00
2015-02-22 09:42:38 +01:00
-- We can also implement 'MimeRender' explicitly for additional formats.
instance MimeRender PlainText Greet where
2015-05-14 01:01:41 +02:00
mimeRender Proxy (Greet s) = "< h1 > " < > cs s < > "< / h1 > "
2015-02-22 07:18:07 +01:00
2014-12-08 11:25:52 +01:00
-- we provide a sample value for the 'Greet' type
instance ToSample Greet where
2020-09-03 06:43:10 +02:00
toSamples _ = singleSample g
2014-12-08 11:25:52 +01:00
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."
2020-09-03 06:43:10 +02:00
Normal
2014-12-08 11:25:52 +01:00
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 =
2015-02-22 09:42:38 +01:00
"hello" :> Capture "name" Text :> QueryParam "capital" Bool :> Get '[JSON,PlainText] Greet
2020-09-03 06:43:10 +02:00
:< |> "greet" :> ReqBody '[JSON] Greet :> Post '[JSON] Greet
:< |> "delete" :> Capture "greetid" Text :> Delete '[JSON] ()
2014-12-08 11:25:52 +01:00
testApi :: Proxy TestApi
testApi = Proxy
-- Generate the Documentation's ADT
greetDocs :: API
greetDocs = docs testApi
main :: IO ()
main = putStrLn $ markdown greetDocs
```