{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Prelude ()
import Prelude.Compat
import Control.Monad.Except
import Control.Monad.Reader
import Data.Aeson
import Data.Aeson.Types
import Data.Attoparsec.ByteString
import Data.ByteString (ByteString)
import Data.List
import Data.Maybe
import Data.String.Conversions
import Data.Time.Calendar
import GHC.Generics
import Lucid
import Network.HTTP.Media ((//), (/:))
import Network.Wai
import Network.Wai.Handler.Warp
import Servant
import System.Directory
import Text.Blaze
import Text.Blaze.Html.Renderer.Utf8
import Servant.Types.SourceT (source)
import qualified Data.Aeson.Parser
import qualified Text.Blaze.Html
data User = User
{ name :: String
, age :: Int
, email :: String
, registration_date :: Day
} deriving (Eq, Show, Generic)
instance ToJSON User
loginPage :: Html ()
loginPage = html_ $ do
head_ $ do
title_ "Random Stuff"
link_ [rel_ "stylesheet", type_ "text/css", href_ "screen.css"]
body_ $ do
h1_ "Welcome to our site!"
h2_ $ span_ "New user?"
users :: [User]
users =
[ User "Isaac Newton" 372 "isaac@newton.co.uk" (fromGregorian 1683 3 1)
, User "Albert Einstein" 136 "ae@mc2.org" (fromGregorian 1905 12 1)
]
data HTMLLucid
instance Accept HTMLLucid where
contentType _ = "text" // "html" /: ("charset", "utf-8")
instance ToHtml a => MimeRender HTMLLucid a where
mimeRender _ = renderBS . toHtml
-- let's also provide an instance for lucid's
-- 'Html' wrapper.
instance MimeRender HTMLLucid (Html a) where
mimeRender _ = renderBS
type UserAPI = "users" :> Get '[JSON] [User]
:<|> "login" :> Get '[HTMLLucid] (Html ())
server :: Server UserAPI
server = return users
:<|> return loginPage
userAPI :: Proxy UserAPI
userAPI = Proxy
userHandler :: Application
userHandler = serve userAPI server
main :: IO ()
main = run 8081 userHandler
Hello. I have been trying to get a HTML page, but without any luck. Could you please correct the code so that by going to the /login URL the HTML page renders correctly.
Currently, it shows this error during compilation:
Main.hs:83:15: error:
• Overlapping instances for MimeRender
HTMLLucid (HtmlT Data.Functor.Identity.Identity ())
arising from a use of ‘serve’
Matching instances:
two instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the expression: serve userAPI server
In an equation for ‘userHandler’:
userHandler = serve userAPI server
|
83 | userHandler = serve userAPI server