module Yesod.Raml.Docs(
htmlFromRaml
, parseRamlDocsFile
) where
import Yesod.Raml.Parser
import Yesod.Raml.Type
import Text.Hamlet
import Yesod.Markdown
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Data.Yaml.Include as YI
import qualified Data.Yaml as Y
import Data.Monoid
import Language.Haskell.TH.Syntax
import qualified Paths_yesod_raml_docs as D
import Data.Version (showVersion)
yesodRamlDocsVersion :: String
yesodRamlDocsVersion = showVersion D.version
txt2md :: T.Text -> Html
txt2md txt =
case (markdownToHtml (Markdown txt)) of
Left msg -> error $ show msg
Right md -> md
findAuth :: Auth -> Raml -> Maybe RamlSecuritySchemes
findAuth auth raml = M.lookup auth (foldr1 (<>) (securitySchemes raml))
haveMethodParam :: RamlMethod -> Bool
haveMethodParam method = not ((M.null (m_queryParameters method)) && (M.null (m_headers method)) && (M.null (m_body method)))
haveResourceParam :: RamlResource -> Bool
haveResourceParam resource = not ((M.null (r_uriParameters resource)) && (M.null (r_baseUriParameters resource)))
haveParam :: RamlResource -> RamlMethod -> Bool
haveParam resource method = haveMethodParam method || haveResourceParam resource
haveMethod :: RamlResource -> Bool
haveMethod resource = (not (M.null (r_methods resource)))
scriptBody :: Html
scriptBody = $(shamletFile "templates/script.hamlet")
styleBody :: Html
styleBody = $(shamletFile "templates/style.hamlet")
htmlFromRaml :: Raml -> Html
htmlFromRaml raml = docs $ genUriParamDescription $ applyTrait $ applyResourceType $ applyVersion raml
docs :: Raml -> Html
docs raml = $(shamletFile "templates/docs.hamlet")
resources :: Raml -> RamlResource -> T.Text -> T.Text -> Html
resources raml res puri ruri = $(shamletFile "templates/resource.hamlet")
items :: T.Text -> RamlNamedParameters -> Html
items key item = $(shamletFile "templates/item.hamlet")
docId :: T.Text -> T.Text
docId uri =
T.replace "{" "_"
$ T.replace "}" "_"
$ T.replace " " "_"
$ T.replace "." "_"
$ T.replace "/" "_" uri
parseRamlDocsFile :: FilePath -> Q Exp
parseRamlDocsFile file = do
qAddDependentFile file
raml <- qRunIO $ do
eRaml <- YI.decodeFileEither file :: IO (Either Y.ParseException Raml)
case eRaml of
Right v -> return v
Left e -> error $ "Invalid raml :" ++ show e
[|htmlFromRaml raml|]