2014-12-10 16:10:57 +01:00
|
|
|
{-# LANGUAGE TypeFamilies #-}
|
2015-03-09 15:16:38 +01:00
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
2014-12-10 16:10:57 +01:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
|
|
|
-- | This module lets you implement 'Server's for defined APIs. You'll
|
|
|
|
-- most likely just need 'serve'.
|
|
|
|
module Servant.Server
|
2015-02-24 13:46:50 +01:00
|
|
|
( -- * Run a wai application from an API
|
2014-12-10 16:10:57 +01:00
|
|
|
serve
|
|
|
|
|
2015-02-24 13:46:50 +01:00
|
|
|
, -- * Construct a wai Application from an API
|
|
|
|
toApplication
|
|
|
|
|
2014-12-10 16:10:57 +01:00
|
|
|
, -- * Handlers for all standard combinators
|
|
|
|
HasServer(..)
|
2015-03-09 15:16:38 +01:00
|
|
|
, Server
|
2014-12-10 16:10:57 +01:00
|
|
|
) where
|
|
|
|
|
2015-01-06 17:25:25 +01:00
|
|
|
import Data.Proxy (Proxy)
|
|
|
|
import Network.Wai (Application)
|
2015-03-09 19:59:25 +01:00
|
|
|
import Servant.API (Canonicalize, canonicalize)
|
2014-12-10 16:10:57 +01:00
|
|
|
import Servant.Server.Internal
|
|
|
|
|
2015-01-06 17:25:25 +01:00
|
|
|
|
2014-12-10 16:10:57 +01:00
|
|
|
-- * Implementing Servers
|
|
|
|
|
|
|
|
-- | 'serve' allows you to implement an API and produce a wai 'Application'.
|
|
|
|
--
|
|
|
|
-- Example:
|
|
|
|
--
|
2015-01-13 20:40:41 +01:00
|
|
|
-- > type MyApi = "books" :> Get '[JSON] [Book] -- GET /books
|
|
|
|
-- > :<|> "books" :> ReqBody Book :> Post '[JSON] Book -- POST /books
|
2014-12-10 16:10:57 +01:00
|
|
|
-- >
|
|
|
|
-- > server :: Server MyApi
|
|
|
|
-- > server = listAllBooks :<|> postBook
|
|
|
|
-- > where listAllBooks = ...
|
|
|
|
-- > postBook book = ...
|
|
|
|
-- >
|
2015-01-01 21:10:17 +01:00
|
|
|
-- > myApi :: Proxy MyApi
|
2015-01-06 17:25:25 +01:00
|
|
|
-- > myApi = Proxy
|
2015-01-01 21:10:17 +01:00
|
|
|
-- >
|
2014-12-10 16:10:57 +01:00
|
|
|
-- > app :: Application
|
|
|
|
-- > app = serve myApi server
|
|
|
|
-- >
|
|
|
|
-- > main :: IO ()
|
|
|
|
-- > main = Network.Wai.Handler.Warp.run 8080 app
|
2015-03-09 15:16:38 +01:00
|
|
|
serve :: HasServer (Canonicalize layout) => Proxy layout -> Server layout -> Application
|
|
|
|
serve p server = toApplication (route (canonicalize p) server)
|
|
|
|
|
|
|
|
type Server layout = Server' (Canonicalize layout)
|