From 66456cafa2c73993d1376c97759aff37290dcee4 Mon Sep 17 00:00:00 2001 From: Alp Mestanogullari Date: Tue, 5 May 2015 21:50:24 +0200 Subject: [PATCH] refactor a bit + add GS2 --- servant-examples/getting-started/GS1.hs | 11 ++--- servant-examples/getting-started/GS2.hs | 49 +++++++++++++++++++ .../getting-started/getting-started.hs | 24 +++++++++ servant-examples/servant-examples.cabal | 6 ++- 4 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 servant-examples/getting-started/GS2.hs create mode 100644 servant-examples/getting-started/getting-started.hs diff --git a/servant-examples/getting-started/GS1.hs b/servant-examples/getting-started/GS1.hs index 9cc815b6..a6daffec 100644 --- a/servant-examples/getting-started/GS1.hs +++ b/servant-examples/getting-started/GS1.hs @@ -2,11 +2,12 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TypeOperators #-} +module GS1 where import Data.Aeson import Data.Time.Calendar import GHC.Generics -import Network.Wai.Handler.Warp (run) +import Network.Wai import Servant data User = User @@ -37,9 +38,5 @@ userAPI = Proxy server :: Server UserAPI server = return users -runServer :: Int -> IO () -runServer port = run port (serve userAPI server) - -main :: IO () -main = runServer 8081 - +app :: Application +app = serve userAPI server diff --git a/servant-examples/getting-started/GS2.hs b/servant-examples/getting-started/GS2.hs new file mode 100644 index 00000000..bf935320 --- /dev/null +++ b/servant-examples/getting-started/GS2.hs @@ -0,0 +1,49 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE TypeOperators #-} +module GS2 where + +import Data.Aeson +import Data.Time.Calendar +import GHC.Generics +import Network.Wai +import Servant + +data User = User + { name :: String + , age :: Int + , email :: String + , registration_date :: Day + } deriving (Eq, Show, Generic) + +-- orphan ToJSON instance for Day. necessary to derive one for User +instance ToJSON Day where + -- display a day in YYYY-mm-dd format + toJSON d = toJSON (showGregorian d) + +instance ToJSON User + +type UserAPI = "users" :> Get '[JSON] [User] + :<|> "albert" :> Get '[JSON] User + :<|> "isaac" :> Get '[JSON] User + +isaac :: User +isaac = User "Isaac Newton" 372 "isaac@newton.co.uk" (fromGregorian 1683 3 1) + +albert :: User +albert = User "Albert Einstein" 136 "ae@mc2.org" (fromGregorian 1905 12 1) + +users :: [User] +users = [isaac, albert] + +userAPI :: Proxy UserAPI +userAPI = Proxy + +server :: Server UserAPI +server = return users + :<|> return albert + :<|> return isaac + +app :: Application +app = serve userAPI server diff --git a/servant-examples/getting-started/getting-started.hs b/servant-examples/getting-started/getting-started.hs new file mode 100644 index 00000000..1b757e8e --- /dev/null +++ b/servant-examples/getting-started/getting-started.hs @@ -0,0 +1,24 @@ +import Network.Wai +import Network.Wai.Handler.Warp +import System.Environment + +import qualified GS1 +import qualified GS2 + +app :: String -> Maybe Application +app n = case n of + "1" -> Just GS1.app + "2" -> Just GS2.app + _ -> Nothing + +main :: IO () +main = do + args <- getArgs + case args of + [n] -> maybe usage (run 8081) (app n) + _ -> usage + +usage :: IO () +usage = do + putStrLn "Usage:\t getting-started N" + putStrLn "\t\twhere N is the number of the example you want to run." diff --git a/servant-examples/servant-examples.cabal b/servant-examples/servant-examples.cabal index c0869ef7..4fc63834 100644 --- a/servant-examples/servant-examples.cabal +++ b/servant-examples/servant-examples.cabal @@ -13,8 +13,9 @@ category: Web build-type: Simple cabal-version: >=1.10 -executable getting-started-1 - main-is: GS1.hs +executable getting-started + main-is: getting-started.hs + other-modules: GS1, GS2 build-depends: aeson >= 0.8 , base >= 4.7 @@ -22,6 +23,7 @@ executable getting-started-1 , servant , servant-server , time + , wai , warp hs-source-dirs: getting-started default-language: Haskell2010