{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TypeOperators #-} module Main (main, Foo (..)) where import Prelude () import Prelude.Compat import Data.Csv (DefaultOrdered, FromRecord, ToNamedRecord, ToRecord) import Data.Maybe (fromMaybe) import GHC.Generics (Generic) import Network.Wai (Application) import Servant import Servant.CSV.Cassava import System.Environment (getArgs, lookupEnv) import Text.Read (readMaybe) import qualified Network.Wai.Handler.Warp as Warp data Foo = Foo { fooName :: String , fooNum :: Int } deriving (Eq, Show, Generic) instance DefaultOrdered Foo instance FromRecord Foo instance ToNamedRecord Foo instance ToRecord Foo type API = "post" :> ReqBody '[CSV] [Foo] :> Post '[CSV] [Foo] :<|> "csv" :> Get '[CSV] [Foo] :<|> "tsv" :> Get '[CSV' 'NoHeader TabSeparatedOpts] [Foo] api :: Proxy API api = Proxy server :: Server API server = pure :<|> pure [Foo "Csv!" 42] :<|> pure [Foo "Tsv!" 7] 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"