{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} import Data.Aeson import Data.Text import GHC.Generics import Network.Wai import Network.Wai.Handler.Warp import Network.Wai.Middleware.RequestLogger import Servant data Product = Product { name :: Text , brand :: Text , current_price_eur :: Double , available :: Bool } deriving (Eq, Show, Generic) instance ToJSON Product products :: [Product] products = [p1, p2] where p1 = Product "Haskell laptop sticker" "GHC Industries" 2.50 True p2 = Product "Foldable USB drive" "Well-Typed" 13.99 False type SimpleAPI = Get '[JSON] [Product] simpleAPI :: Proxy SimpleAPI simpleAPI = Proxy server :: Server SimpleAPI server = return products -- logStdout :: Middleware -- i.e, logStdout :: Application -> Application -- serve :: Proxy api -> Server api -> Application -- so applying a middleware is really as simple as -- applying a function to the result of 'serve' app :: Application app = logStdout (serve simpleAPI server) main :: IO () main = run 8080 app