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
20import Network.Wai.Handler.Warp
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."
47instance ToSample Greet where
48 toSample Proxy = Just (encode g)
50 where g = Greet "Hello, haskeller!"
54 "hello" :> Capture "name" Text :> QueryParam "capital" Bool :> Get Greet
55 :<|> "greet" :> ReqBody Greet :> Post Greet
56 :<|> "delete" :> Capture "greetid" Text :> Delete
58testApi :: Proxy TestApi
61-- Server-side handlers
62server :: Server TestApi
63server = hello :<|> greet :<|> delete
65 where hello name Nothing = hello name (Just False)
66 hello name (Just False) = return . Greet $ "Hello, " <> name
67 hello name (Just True) = return . Greet . toUpper $ "Hello, " <> name
73-- Client-side query functions
74clientApi :: Client TestApi
75clientApi = client testApi
77getGreet :: Text -> Maybe Bool -> URI -> EitherT String IO Greet
78postGreet :: Greet -> URI -> EitherT String IO Greet
79deleteGreet :: Text -> URI -> EitherT String IO ()
80getGreet :<|> postGreet :<|> deleteGreet = clientApi
82-- Turn the server into a WAI app
84test = serve testApi server
88docsGreet = docs testApi
91runTestServer :: Port -> IO ()
92runTestServer port = run port test
94-- Run some queries against the server
97 tid <- forkIO $ runTestServer 8001
98 let Just uri = parseURI "http://localhost:8001"
99 print =<< runEitherT (getGreet "alp" (Just True) uri)
100 print =<< runEitherT (getGreet "alp" (Just False) uri)
102 print =<< runEitherT (postGreet g uri)
103 print =<< runEitherT (deleteGreet "blah" uri)
105 putStrLn "\n---------\n"
106 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