1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE PolyKinds #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE DeriveGeneric #-}
5{-# LANGUAGE TypeOperators #-}
6{-# LANGUAGE FlexibleInstances #-}
7{-# LANGUAGE OverloadedStrings #-}
8{-# LANGUAGE QuasiQuotes #-}
9{-# OPTIONS_GHC -fno-warn-orphans #-}
11import Control.Concurrent (forkIO, killThread)
12import Control.Monad.Trans.Either
19import Network.Wai.Handler.Warp
25import Servant.Utils.BaseUrl
29data Greet = Greet { _msg :: Text }
30 deriving (Generic, Show)
32instance FromJSON Greet
35instance ToCapture (Capture "name" Text) where
36 toCapture _ = DocCapture "name" "name of the person to greet"
38instance ToCapture (Capture "greetid" Text) where
39 toCapture _ = DocCapture "greetid" "identifier of the greet msg to remove"
41instance ToParam (QueryParam "capital" Bool) where
43 DocQueryParam "capital"
45 "Get the greeting message in uppercase (true) or not (false). Default is false."
48instance ToSample Greet where
49 toSample Proxy = Just (encode g)
51 where g = Greet "Hello, haskeller!"
55 "hello" :> Capture "name" Text :> QueryParam "capital" Bool :> Get Greet
56 :<|> "greet" :> ReqBody Greet :> Post Greet
57 :<|> "delete" :> Capture "greetid" Text :> Delete
59testApi :: Proxy TestApi
62-- Server-side handlers
63server :: Server TestApi
64server = hello :<|> greet :<|> delete
66 where hello name Nothing = hello name (Just False)
67 hello name (Just False) = return . Greet $ "Hello, " <> name
68 hello name (Just True) = return . Greet . toUpper $ "Hello, " <> name
74-- Client-side query functions
75clientApi :: Client TestApi
76clientApi = client testApi
78getGreet :: Text -> Maybe Bool -> BaseUrl -> EitherT String IO Greet
79postGreet :: Greet -> BaseUrl -> EitherT String IO Greet
80deleteGreet :: Text -> BaseUrl -> EitherT String IO ()
81getGreet :<|> postGreet :<|> deleteGreet = clientApi
83-- Turn the server into a WAI app
85test = serve testApi server
89docsGreet = docs testApi
92runTestServer :: Port -> IO ()
93runTestServer port = run port test
95-- Run some queries against the server
98 tid <- forkIO $ runTestServer 8001
99 let uri = BaseUrl Http "localhost" 8001
100 print =<< runEitherT (getGreet "alp" (Just True) uri)
101 print =<< runEitherT (getGreet "alp" (Just False) uri)
103 print =<< runEitherT (postGreet g uri)
104 print =<< runEitherT (deleteGreet "blah" uri)
106 putStrLn "\n---------\n"
107 printMarkdown docsGreet
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list