servant-yaml-0.1.0.0: example/Main.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
module Main (main) where
import Prelude ()
import Prelude.Compat
import Data.Aeson.TH
import Data.Char (toLower)
import Data.Maybe (fromMaybe)
import Network.Wai (Application)
import Servant
import Servant.Yaml
import System.Environment (getArgs, lookupEnv)
import Text.Read (readMaybe)
import qualified Network.Wai.Handler.Warp as Warp
data Foo = Foo
{ _fooFoo :: Int
, _fooBar :: String
}
deriving (Eq, Show)
$(deriveJSON defaultOptions{fieldLabelModifier = map toLower . drop 4} ''Foo)
type API = "foo" :> ReqBody '[JSON, YAML] Foo :> Post '[JSON, YAML] Foo
:<|> Get '[YAML, JSON] Foo
api :: Proxy API
api = Proxy
server :: Server API
server = pure :<|> pure (Foo 42 "Yaml!")
app :: Application
app = serve api server
main :: IO ()
main = do
args <- getArgs
case args of
("run":_) -> do
port <- fromMaybe 8000 . (>>= readMaybe) <$> lookupEnv "PORT"
Warp.run port app
_ -> putStrLn "To run, pass run argument"