95 lines
2.8 KiB
Haskell
95 lines
2.8 KiB
Haskell
|
{-# LANGUAGE DataKinds #-}
|
||
|
{-# LANGUAGE TypeFamilies #-}
|
||
|
{-# LANGUAGE TypeOperators #-}
|
||
|
{-# LANGUAGE FlexibleInstances #-}
|
||
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||
|
module GS10 where
|
||
|
|
||
|
import Data.ByteString.Lazy (ByteString)
|
||
|
import Data.Text.Lazy (pack)
|
||
|
import Data.Text.Lazy.Encoding (encodeUtf8)
|
||
|
import Network.HTTP.Types
|
||
|
import Network.Wai
|
||
|
import Servant
|
||
|
import Servant.Docs
|
||
|
import Servant.Docs.Pandoc (pandoc)
|
||
|
import Text.Pandoc.Options (def, WriterOptions(..))
|
||
|
import Text.Pandoc.Writers.HTML (writeHtmlString)
|
||
|
import qualified GS3
|
||
|
|
||
|
type DocsAPI = GS3.API :<|> Raw
|
||
|
|
||
|
instance ToCapture (Capture "x" Int) where
|
||
|
toCapture _ = DocCapture "x" "(integer) position on the x axis"
|
||
|
|
||
|
instance ToCapture (Capture "y" Int) where
|
||
|
toCapture _ = DocCapture "y" "(integer) position on the y axis"
|
||
|
|
||
|
instance ToSample GS3.Position GS3.Position where
|
||
|
toSample _ = Just (GS3.Position 3 14)
|
||
|
|
||
|
instance ToParam (QueryParam "name" String) where
|
||
|
toParam _ =
|
||
|
DocQueryParam "name"
|
||
|
["Alp", "John Doe", "..."]
|
||
|
"Name of the person to say hello to."
|
||
|
Normal
|
||
|
|
||
|
instance ToSample GS3.HelloMessage GS3.HelloMessage where
|
||
|
toSamples _ =
|
||
|
[ ("When a value is provided for 'name'", GS3.HelloMessage "Hello, Alp")
|
||
|
, ("When 'name' is not specified", GS3.HelloMessage "Hello, anonymous coward")
|
||
|
]
|
||
|
|
||
|
ci :: GS3.ClientInfo
|
||
|
ci = GS3.ClientInfo "Alp" "alp@foo.com" 26 ["haskell", "mathematics"]
|
||
|
|
||
|
instance ToSample GS3.ClientInfo GS3.ClientInfo where
|
||
|
toSample _ = Just ci
|
||
|
|
||
|
instance ToSample GS3.Email GS3.Email where
|
||
|
toSample _ = Just (GS3.emailForClient ci)
|
||
|
|
||
|
api :: Proxy DocsAPI
|
||
|
api = Proxy
|
||
|
|
||
|
docsBS :: ByteString
|
||
|
docsBS = encodeUtf8
|
||
|
. pack
|
||
|
. writeHtmlString opts
|
||
|
. pandoc
|
||
|
$ docsWithIntros [intro] GS3.api
|
||
|
|
||
|
where opts = def { writerHtml5 = True
|
||
|
, writerTableOfContents = True
|
||
|
, writerHighlight = True
|
||
|
, writerStandalone = True
|
||
|
, writerTemplate =
|
||
|
concat
|
||
|
[ "<!DOCTYPE html><html>"
|
||
|
, "<head>"
|
||
|
, "<meta charset=\"UTF-8\">"
|
||
|
, "<title>API Docs - $title$</title>"
|
||
|
, "</head>"
|
||
|
, "<body>"
|
||
|
, "$toc$"
|
||
|
, "<hr />"
|
||
|
, "$body$"
|
||
|
, "</body>"
|
||
|
, "</html>"
|
||
|
]
|
||
|
}
|
||
|
intro = DocIntro "Welcome" ["This is our super webservice's API.", "Enjoy!"]
|
||
|
|
||
|
server :: Server DocsAPI
|
||
|
server = GS3.server :<|> serveDocs
|
||
|
|
||
|
where serveDocs _ respond =
|
||
|
respond $ responseLBS ok200 [html] docsBS
|
||
|
|
||
|
html = ("Content-Type", "text/html")
|
||
|
|
||
|
app :: Application
|
||
|
app = serve api server
|