servant/servant-server/src/Servant/Server.hs

50 lines
1.3 KiB
Haskell
Raw Normal View History

2014-12-10 16:10:57 +01:00
{-# LANGUAGE TypeFamilies #-}
{-# 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(..)
, Server
, ServerT
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 = ...
-- >
-- > myApi :: Proxy MyApi
2015-01-06 17:25:25 +01:00
-- > myApi = Proxy
-- >
2014-12-10 16:10:57 +01:00
-- > app :: Application
-- > app = serve myApi server
-- >
-- > main :: IO ()
-- > main = Network.Wai.Handler.Warp.run 8080 app
serve :: HasServer (Canonicalize layout) => Proxy layout -> Server layout -> Application
serve p server = toApplication (route (canonicalize p) server)