git.iko.soy/typeable/servant
on feef8ca help sign in
63 lines 1.4 kB history raw
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE TypeOperators #-}
7module T4 where
9import Data.Aeson
10import Data.Foldable (foldMap)
11import GHC.Generics
12import Lucid
13import Network.Wai
14import Servant
15import Servant.HTML.Lucid
17data Person = Person
18 { firstName :: String
19 , lastName :: String
20 , age :: Int
21 } deriving Generic -- for the JSON instance
23-- JSON serialization
24instance ToJSON Person
26-- HTML serialization of a single person
27instance ToHtml Person where
28 toHtml person =
29 tr_ $ do
30 td_ (toHtml $ firstName person)
31 td_ (toHtml $ lastName person)
32 td_ (toHtml . show $ age person)
34 toHtmlRaw = toHtml
36-- HTML serialization of a list of persons
37instance ToHtml [Person] where
38 toHtml persons = table_ $ do
39 tr_ $ do
40 th_ "first name"
41 th_ "last name"
42 th_ "age"
44 foldMap toHtml persons
46 toHtmlRaw = toHtml
48persons :: [Person]
49persons =
50 [ Person "Isaac" "Newton" 372
51 , Person "Albert" "Einstein" 136
52 ]
54type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
56personAPI :: Proxy PersonAPI
57personAPI = Proxy
59server :: Server PersonAPI
60server = return persons
62app :: Application
63app = serve personAPI server