git.iko.soy/typeable/servant
on master help sign in
examples: add GS4
commite81ac8fbc5dcf09268f2d8e0e9dbd4c0fda98cc3 authorAlp Mestanogullari <alpmestan@gmail.com> dateWed 6 May 2015, 13:36 (11 years ago) parentf3002b3
3 files changed+67
servant-examples/getting-started/GS4.hs+63 servant-examples/getting-started/getting-started.hs+2 servant-examples/servant-examples.cabal+2
servant-examples/getting-started/GS4.hsnew file+63
@@ -0,0 +1,63 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE DeriveGeneric #-}
4+{-# LANGUAGE TypeOperators #-}
5+{-# LANGUAGE FlexibleInstances #-}
6+{-# LANGUAGE OverloadedStrings #-}
7+module GS4 where
8+
9+import Data.Aeson
10+import Data.Foldable (foldMap)
11+import GHC.Generics
12+import Lucid
13+import Network.Wai
14+import Servant
15+import Servant.HTML.Lucid
16+
17+data Person = Person
18+ { firstName :: String
19+ , lastName :: String
20+ , age :: Int
21+ } deriving Generic -- for the JSON instance
22+
23+-- JSON serialization
24+instance ToJSON Person
25+
26+-- HTML serialization of a single person
27+instance ToHtml Person where
28+ toHtml p =
29+ tr_ $ do
30+ td_ (toHtml $ firstName p)
31+ td_ (toHtml $ lastName p)
32+ td_ (toHtml . show $ age p)
33+
34+ toHtmlRaw = toHtml
35+
36+-- HTML serialization of a list of persons
37+instance ToHtml [Person] where
38+ toHtml persons = table_ $ do
39+ tr_ $ do
40+ td_ "first name"
41+ td_ "last name"
42+ td_ "age"
43+
44+ foldMap toHtml persons
45+
46+ toHtmlRaw = toHtml
47+
48+persons :: [Person]
49+persons =
50+ [ Person "Isaac" "Newton" 372
51+ , Person "Albert" "Einstein" 136
52+ ]
53+
54+type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
55+
56+personAPI :: Proxy PersonAPI
57+personAPI = Proxy
58+
59+server :: Server PersonAPI
60+server = return persons
61+
62+app :: Application
63+app = serve personAPI server
servant-examples/getting-started/getting-started.hs+2
@@ -5,12 +5,14 @@ import System.Environment
55import qualified GS1
66import qualified GS2
77import qualified GS3
8+import qualified GS4
89
910app :: String -> Maybe Application
1011app n = case n of
1112 "1" -> Just GS1.app
1213 "2" -> Just GS2.app
1314 "3" -> Just GS3.app
15+ "4" -> Just GS4.app
1416 _ -> Nothing
1517
1618main :: IO ()
servant-examples/servant-examples.cabal+2
@@ -20,7 +20,9 @@ executable getting-started
2020 aeson >= 0.8
2121 , base >= 4.7
2222 , either
23+ , lucid
2324 , servant
25+ , servant-lucid
2426 , servant-server
2527 , time
2628 , wai