{- | Parse and render an API type, write documentation to file, stdout
__Example script__
[Writing documentation to file](https://github.com/Holmusk/servant-docs-simple/blob/master/examples/generate.hs)
/With the following language extensions/
> DataKinds
> TypeApplications
> TypeOperators
/Using this script/
> module Main where
>
> import Servant.API ((:>), Post, ReqBody)
> import Servant.Docs.Simple (writeDocsJson, writeDocsPlainText)
>
> -- Our API type
> type API = "hello" :> "world" :> Request :> Response
> type Request = ReqBody '[()] ()
> type Response = Post '[()] ()
>
> main :: IO ()
> main = do
> -- Writes to the file $PWD/docsJson
> writeDocsJson @API "docs.json"
>
> -- Writes to the file $PWD/docsPlainText
> writeDocsPlainText @API "docs.txt"
__Expected Output__
/Files should be generated relative to @$PWD@/
> $ ls | grep docs
> docs.json
> docs.txt
/docs.json/
> {
> "/hello/world": {
> "Response": {
> "Format": "': * () ('[] *)",
> "ContentType": "()"
> },
> "RequestType": "'POST",
> "RequestBody": {
> "Format": "': * () ('[] *)",
> "ContentType": "()"
> }
> }
> }
/docs.txt/
> /hello/world:
> RequestBody:
> Format: ': * () ('[] *)
> ContentType: ()
> RequestType: 'POST
> Response:
> Format: ': * () ('[] *)
> ContentType: ()
-}
module Servant.Docs.Simple ( document
, documentWith
, stdoutJson
, stdoutMarkdown
, stdoutPlainText
, writeDocsJson
, writeDocsMarkdown
, writeDocsPlainText
) where
import Data.Aeson.Encode.Pretty (encodePretty)
import qualified Data.ByteString.Lazy as B (writeFile)
import qualified Data.ByteString.Lazy.Char8 as BC (putStrLn)
import qualified Data.Text.IO as T (putStrLn, writeFile)
import Servant.Docs.Simple.Parse (HasParsableApi (..))
import Servant.Docs.Simple.Render (Json (..), Markdown (..), PlainText (..), Renderable (..))
-- | Write documentation as PlainText to file
writeDocsPlainText :: forall api. HasParsableApi api => FilePath -> IO ()
writeDocsPlainText fp = T.writeFile fp . getPlainText $ document @api
-- | Write documentation as Markdown to file
writeDocsMarkdown :: forall api. HasParsableApi api => FilePath -> IO ()
writeDocsMarkdown fp = T.writeFile fp . getMarkdown $ documentWith @api @Markdown
-- | Write documentation as JSON to file
writeDocsJson :: forall api. HasParsableApi api => FilePath -> IO ()
writeDocsJson fp = B.writeFile fp . encodePretty . getJson $ documentWith @api @Json
-- | Write documentation as PlainText to stdout
stdoutPlainText :: forall api. HasParsableApi api => IO ()
stdoutPlainText = T.putStrLn . getPlainText $ document @api
-- | Write documentation as Markdown to stdout
stdoutMarkdown :: forall api. HasParsableApi api => IO ()
stdoutMarkdown = T.putStrLn . getMarkdown $ documentWith @api @Markdown
-- | Write documentation as JSON to stdout
stdoutJson :: forall api. HasParsableApi api => IO ()
stdoutJson = BC.putStrLn . encodePretty . getJson $ documentWith @api @Json
-- | Convert API type into PlainText format
document :: forall api. HasParsableApi api => PlainText
document = documentWith @api @PlainText
-- | Convert API type into specified formats
documentWith :: forall api a. (HasParsableApi api, Renderable a) => a
documentWith = render @a (parseApi @api)