git.iko.soy/typeable/servant
on bump-ci help sign in
74 lines 2.1 kB history raw
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE PolyKinds #-}
5{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE TypeOperators #-}
8import Prelude ()
9import Prelude.Compat
11import Data.Aeson
12import Data.Proxy
13import Data.Text
14import GHC.Generics
15import Network.Wai
16import Network.Wai.Handler.Warp
18import Servant
20-- * Example
22-- | A greet message data type
23newtype Greet = Greet { _msg :: Text }
24 deriving (Generic, Show)
26instance FromJSON Greet
27instance ToJSON Greet
29-- API specification
30type TestApi =
31 -- GET /hello/:name?capital={true, false} returns a Greet as JSON
32 "hello" :> Capture "name" Text :> QueryParam "capital" Bool :> Get '[JSON] Greet
34 -- POST /greet with a Greet as JSON in the request body,
35 -- returns a Greet as JSON
36 :<|> "greet" :> ReqBody '[JSON] Greet :> Post '[JSON] Greet
38 -- DELETE /greet/:greetid
39 :<|> "greet" :> Capture "greetid" Text :> Delete '[JSON] NoContent
41testApi :: Proxy TestApi
42testApi = Proxy
44-- Server-side handlers.
45--
46-- There's one handler per endpoint, which, just like in the type
47-- that represents the API, are glued together using :<|>.
48--
49-- Each handler runs in the 'Handler' monad.
50server :: Server TestApi
51server = helloH :<|> postGreetH :<|> deleteGreetH
53 where helloH name Nothing = helloH name (Just False)
54 helloH name (Just False) = return . Greet $ "Hello, " <> name
55 helloH name (Just True) = return . Greet . toUpper $ "Hello, " <> name
57 postGreetH greet = return greet
59 deleteGreetH _ = return NoContent
61-- Turn the server into a WAI app. 'serve' is provided by servant,
62-- more precisely by the Servant.Server module.
63test :: Application
64test = serve testApi server
66-- Run the server.
67--
68-- 'run' comes from Network.Wai.Handler.Warp
69runTestServer :: Port -> IO ()
70runTestServer port = run port test
72-- Put this all to work!
73main :: IO ()
74main = runTestServer 8001