-------------------------------------------------------------------------------
-- | This module lets you get API docs for free. It lets you generate
-- an 'API' from the type that represents your API using 'docs':
--
-- @docs :: 'HasDocs' api => 'Proxy' api -> 'API'@
--
-- Alternatively, if you wish to add one or more introductions to your
-- documentation, use 'docsWithIntros':
--
-- @'docsWithIntros' :: 'HasDocs' api => [DocIntro] -> 'Proxy' api -> 'API'@
--
-- You can then call 'markdown' on the 'API' value:
--
-- @'markdown' :: 'API' -> String@
--
-- or define a custom pretty printer:
--
-- @yourPrettyDocs :: 'API' -> String -- or blaze-html's HTML, or ...@
--
-- The only thing you'll need to do will be to implement some classes
-- for your captures, get parameters and request or response bodies.
--
-- See example/greet.hs for an example.
module Servant.Docs
  ( -- * 'HasDocs' class and key functions
    HasDocs(..), docs, pretty, markdown
    -- ** Customising generated documentation
  , markdownWith, RenderingOptions(..), defRenderingOptions
  , requestExamples, responseExamples, ShowContentTypes(..), notesHeading
    -- * Generating docs with extra information
  , docsWith, docsWithIntros, docsWithOptions
  , ExtraInfo(..), extraInfo
  , DocOptions(..) , defaultDocOptions, maxSamples

  , -- * Classes you need to implement for your types
    ToSample(..)
  , toSample
  , noSamples
  , singleSample
  , samples
  , sampleByteString
  , sampleByteStrings
  , ToParam(..)
  , ToCapture(..)

  , -- * ADTs to represent an 'API'
    Endpoint, path, method, defEndpoint
  , API, apiIntros, apiEndpoints, emptyAPI
  , DocAuthentication(..), authIntro, authDataRequired
  , DocCapture(..), capSymbol, capDesc
  , DocQueryParam(..), ParamKind(..), paramName, paramValues, paramDesc, paramKind
  , DocNote(..), noteTitle, noteBody
  , DocIntro(..), introTitle, introBody
  , Response(..), respStatus, respTypes, respBody, defResponse
  , Action, authInfo, captures, headers, notes, params, rqtypes, rqbody, response, defAction
  , single
  ) where

import           Servant.Docs.Internal
import           Servant.Docs.Internal.Pretty