git.iko.soy/typeable/servant
on master help sign in
refactor a bit + add GS2
commit66456cafa2c73993d1376c97759aff37290dcee4 authorAlp Mestanogullari <alpmestan@gmail.com> dateTue 5 May 2015, 21:50 (11 years ago) parent2b23253
4 files changed+81−9
servant-examples/getting-started/GS1.hs+4−7 servant-examples/getting-started/GS2.hs+49 servant-examples/getting-started/getting-started.hs+24 servant-examples/servant-examples.cabal+4−2
servant-examples/getting-started/GS1.hs+4−7
@@ -2,11 +2,12 @@
22{-# LANGUAGE TypeFamilies #-}
33{-# LANGUAGE DeriveGeneric #-}
44{-# LANGUAGE TypeOperators #-}
5+module GS1 where
56
67import Data.Aeson
78import Data.Time.Calendar
89import GHC.Generics
9−import Network.Wai.Handler.Warp (run)
10+import Network.Wai
1011import Servant
1112
1213data User = User
@@ -37,9 +38,5 @@ userAPI = Proxy
3738server :: Server UserAPI
3839server = return users
3940
40−runServer :: Int -> IO ()
41−runServer port = run port (serve userAPI server)
42−
43−main :: IO ()
44−main = runServer 8081
45−
41+app :: Application
42+app = serve userAPI server
servant-examples/getting-started/GS2.hsnew file+49
@@ -0,0 +1,49 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE DeriveGeneric #-}
4+{-# LANGUAGE TypeOperators #-}
5+module GS2 where
6+
7+import Data.Aeson
8+import Data.Time.Calendar
9+import GHC.Generics
10+import Network.Wai
11+import Servant
12+
13+data User = User
14+ { name :: String
15+ , age :: Int
16+ , email :: String
17+ , registration_date :: Day
18+ } deriving (Eq, Show, Generic)
19+
20+-- orphan ToJSON instance for Day. necessary to derive one for User
21+instance ToJSON Day where
22+ -- display a day in YYYY-mm-dd format
23+ toJSON d = toJSON (showGregorian d)
24+
25+instance ToJSON User
26+
27+type UserAPI = "users" :> Get '[JSON] [User]
28+ :<|> "albert" :> Get '[JSON] User
29+ :<|> "isaac" :> Get '[JSON] User
30+
31+isaac :: User
32+isaac = User "Isaac Newton" 372 "isaac@newton.co.uk" (fromGregorian 1683 3 1)
33+
34+albert :: User
35+albert = User "Albert Einstein" 136 "ae@mc2.org" (fromGregorian 1905 12 1)
36+
37+users :: [User]
38+users = [isaac, albert]
39+
40+userAPI :: Proxy UserAPI
41+userAPI = Proxy
42+
43+server :: Server UserAPI
44+server = return users
45+ :<|> return albert
46+ :<|> return isaac
47+
48+app :: Application
49+app = serve userAPI server
servant-examples/getting-started/getting-started.hsnew file+24
@@ -0,0 +1,24 @@
1+import Network.Wai
2+import Network.Wai.Handler.Warp
3+import System.Environment
4+
5+import qualified GS1
6+import qualified GS2
7+
8+app :: String -> Maybe Application
9+app n = case n of
10+ "1" -> Just GS1.app
11+ "2" -> Just GS2.app
12+ _ -> Nothing
13+
14+main :: IO ()
15+main = do
16+ args <- getArgs
17+ case args of
18+ [n] -> maybe usage (run 8081) (app n)
19+ _ -> usage
20+
21+usage :: IO ()
22+usage = do
23+ putStrLn "Usage:\t getting-started N"
24+ putStrLn "\t\twhere N is the number of the example you want to run."
servant-examples/servant-examples.cabal+4−2
@@ -13,8 +13,9 @@ category: Web
1313build-type: Simple
1414cabal-version: >=1.10
1515
16−executable getting-started-1
17− main-is: GS1.hs
16+executable getting-started
17+ main-is: getting-started.hs
18+ other-modules: GS1, GS2
1819 build-depends:
1920 aeson >= 0.8
2021 , base >= 4.7
@@ -22,6 +23,7 @@ executable getting-started-1
2223 , servant
2324 , servant-server
2425 , time
26+ , wai
2527 , warp
2628 hs-source-dirs: getting-started
2729 default-language: Haskell2010