on 13664a2 help sign in
servant/example/greet.hs
74 lines 1.9 kB history raw
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE PolyKinds #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE DeriveGeneric #-}
5{-# LANGUAGE TypeOperators #-}
6{-# LANGUAGE OverloadedStrings #-}
8import Control.Concurrent (forkIO, killThread)
9import Control.Monad.Trans.Either
10import Data.Aeson
11import Data.Monoid
12import Data.Proxy
13import Data.Text
14import GHC.Generics
15import Network.URI
16import Network.Wai
17import Network.Wai.Handler.Warp
19import Servant.API
20import Servant.Client
21import Servant.Server
23-- * Example
25data Greet = Greet { msg :: Text }
26 deriving (Generic, Show)
28instance FromJSON Greet
29instance ToJSON Greet
31-- API specification
32type TestApi =
33 "hello" :> Capture "name" Text :> GetParam "capital" Bool :> Get Greet
34 :<|> "greet" :> RQBody Greet :> Post Greet
36testApi :: Proxy TestApi
37testApi = Proxy
39-- Server-side handlers
40server :: Server TestApi
41server = hello :<|> greet
43 where hello name Nothing = hello name (Just False)
44 hello name (Just False) = return . Greet $ "Hello, " <> name
45 hello name (Just True) = return . Greet . toUpper $ "Hello, " <> name
47 greet = return
49-- Client-side query functions
50clientApi :: Client TestApi
51clientApi = client testApi
53getGreet :: Text -> Maybe Bool -> URI -> EitherT String IO Greet
54postGreet :: Greet -> URI -> EitherT String IO Greet
55getGreet :<|> postGreet = clientApi
57-- Turn the server into a WAI app
58test :: Application
59test = serve testApi server
61-- Run the server
62runTestServer :: Port -> IO ()
63runTestServer port = run port test
65-- Run some queries against the server
66main :: IO ()
67main = do
68 tid <- forkIO $ runTestServer 8001
69 let Just uri = parseURI "http://localhost:8001"
70 print =<< runEitherT (getGreet "alp" (Just True) uri)
71 print =<< runEitherT (getGreet "alp" (Just False) uri)
72 let g = Greet "yo"
73 print =<< runEitherT (postGreet g uri)
74 killThread tid