servant/servant-examples/tutorial/T4.hs

65 lines
1.3 KiB
Haskell
Raw Permalink Normal View History

2015-05-06 13:36:04 +02:00
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
2015-09-23 14:58:47 +02:00
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
2015-05-10 13:39:18 +02:00
module T4 where
2015-05-06 13:36:04 +02:00
import Data.Aeson
import Data.Foldable (foldMap)
import GHC.Generics
import Lucid
import Network.Wai
import Servant
import Servant.HTML.Lucid
data Person = Person
{ firstName :: String
, lastName :: String
, age :: Int
} deriving Generic -- for the JSON instance
-- JSON serialization
instance ToJSON Person
-- HTML serialization of a single person
instance ToHtml Person where
toHtml person =
2015-05-06 13:36:04 +02:00
tr_ $ do
td_ (toHtml $ firstName person)
td_ (toHtml $ lastName person)
td_ (toHtml . show $ age person)
2015-05-06 13:36:04 +02:00
toHtmlRaw = toHtml
-- HTML serialization of a list of persons
instance ToHtml [Person] where
2015-09-23 14:58:47 +02:00
toHtml ps = table_ $ do
2015-05-06 13:36:04 +02:00
tr_ $ do
th_ "first name"
th_ "last name"
th_ "age"
2015-05-06 13:36:04 +02:00
2015-09-23 14:58:47 +02:00
foldMap toHtml ps
2015-05-06 13:36:04 +02:00
toHtmlRaw = toHtml
persons :: [Person]
persons =
[ Person "Isaac" "Newton" 372
, Person "Albert" "Einstein" 136
]
type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
personAPI :: Proxy PersonAPI
personAPI = Proxy
server :: Server PersonAPI
server = return persons
app :: Application
app = serve personAPI server