packages feed

hoauth2-demo-1.7.0: src/Views.hs

module Views where

import Control.Monad.IO.Class (liftIO)
import Data.List
import Data.Text.Lazy qualified as TL
import Paths_hoauth2_demo
import Text.Mustache
import Text.Mustache qualified as M
import Text.Parsec.Error
import Types
import Web.Scotty

newtype TemplateData = TemplateData
  { idpSessionData :: [IdpAuthorizationCodeAppSessionData]
  }

instance ToMustache TemplateData where
  toMustache td' =
    M.object
      [ "idps" ~> idpSessionData td'
      ]

tpl :: FilePath -> IO (Either ParseError Template)
tpl f =
  -- NOTE: can work with cabal v2-run demo-server but not v2-exec
  getDataFileName ("public/templates/" ++ f ++ ".mustache")
    >>= localAutomaticCompile

tplS ::
  FilePath ->
  [IdpAuthorizationCodeAppSessionData] ->
  IO TL.Text
tplS path xs = do
  template <- tpl path
  case template of
    Left e ->
      return $
        TL.unlines $
          map TL.pack ["can not parse template " ++ path ++ ".mustache", show e]
    Right t' -> return $ TL.fromStrict $ substitute t' (TemplateData $ sortOn idpName xs)

tplH ::
  FilePath ->
  [IdpAuthorizationCodeAppSessionData] ->
  ActionM ()
tplH path xs = do
  s <- liftIO (tplS path xs)
  html s

overviewTpl :: [IdpAuthorizationCodeAppSessionData] -> ActionM ()
overviewTpl = tplH "index"