From 3a1f7938e8ae63a2f6f641866679b24ac9709c30 Mon Sep 17 00:00:00 2001 From: Diogo Biazus Date: Mon, 5 Oct 2015 14:17:34 -0400 Subject: [PATCH] Moves all config related code to PostgREST.Config module and tweak the code to better encapsulate functionality. --- postgrest.cabal | 2 ++ src/PostgREST/Config.hs | 25 ++++++++++++++++++++++++- src/PostgREST/Main.hs | 23 +++++------------------ 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/postgrest.cabal b/postgrest.cabal index bfe278c4a..af08f499e 100644 --- a/postgrest.cabal +++ b/postgrest.cabal @@ -94,6 +94,7 @@ library , errors , bifunctors + Other-Modules: Paths_postgrest Exposed-Modules: PostgREST.App , PostgREST.Types , PostgREST.Parsers @@ -130,6 +131,7 @@ Test-Suite spec , PostgREST.RangeQuery , Spec , SpecHelper + , Paths_postgrest Build-Depends: base, hspec == 2.1.*, QuickCheck , hspec-wai, hspec-wai-json , hasql, hasql-backend diff --git a/src/PostgREST/Config.hs b/src/PostgREST/Config.hs index 4e2448149..e618b4edc 100644 --- a/src/PostgREST/Config.hs +++ b/src/PostgREST/Config.hs @@ -1,14 +1,22 @@ -module PostgREST.Config where +module PostgREST.Config ( prettyVersion + , readOptions + , corsPolicy + , AppConfig (..) + ) + where import Control.Applicative import qualified Data.ByteString.Char8 as BS import qualified Data.CaseInsensitive as CI +import Data.List (intercalate) import Data.String.Conversions (cs) import Data.Text (strip) +import Data.Version (versionBranch) import Network.Wai import Network.Wai.Middleware.Cors (CorsResourcePolicy (..)) import Options.Applicative hiding (columns) +import Paths_postgrest (version) import Prelude data AppConfig = AppConfig { @@ -63,3 +71,18 @@ corsPolicy req = case lookup "origin" headers of accHeaders = case lookup "access-control-request-headers" headers of Just hdrs -> map (CI.mk . cs . strip . cs) $ BS.split ',' hdrs Nothing -> [] + +prettyVersion :: String +prettyVersion = intercalate "." $ map show $ versionBranch version + +readOptions :: IO AppConfig +readOptions = customExecParser parserPrefs opts + where + opts = info (helper <*> argParser) $ + fullDesc + <> progDesc ( + "PostgREST " + <> prettyVersion + <> " / create a REST API to an existing Postgres database" + ) + parserPrefs = prefs showHelpOnError diff --git a/src/PostgREST/Main.hs b/src/PostgREST/Main.hs index bf756e14d..c5c8b7ce9 100644 --- a/src/PostgREST/Main.hs +++ b/src/PostgREST/Main.hs @@ -1,7 +1,6 @@ module Main where -import Paths_postgrest (version) import PostgREST.PgStructure import PostgREST.Types import Network.Wai @@ -13,22 +12,21 @@ import PostgREST.Middleware import Control.Monad (unless) import Control.Monad.IO.Class (liftIO) import Data.Functor.Identity -import Data.List (intercalate) -import Data.String.Conversions (cs) +import Data.String.Conversions (cs, + (<>)) import Data.Text (Text) -import Data.Version (versionBranch) import qualified Hasql as H import qualified Hasql.Postgres as P import Network.Wai.Handler.Warp hiding (Connection) import Network.Wai.Middleware.RequestLogger (logStdout) -import Options.Applicative hiding (columns) import System.IO (BufferMode (..), hSetBuffering, stderr, stdin, stdout) import PostgREST.Config (AppConfig (..), - argParser) + prettyVersion, + readOptions) isServerVersionSupported :: H.Session P.Postgres IO Bool isServerVersionSupported = do @@ -41,15 +39,7 @@ main = do hSetBuffering stdin LineBuffering hSetBuffering stderr NoBuffering - let opts = info (helper <*> argParser) $ - fullDesc - <> progDesc ( - "PostgREST " - <> prettyVersion - <> " / create a REST API to an existing Postgres database" - ) - parserPrefs = prefs showHelpOnError - conf <- customExecParser parserPrefs opts + conf <- readOptions let port = configPort conf unless (configSecure conf) $ @@ -104,6 +94,3 @@ main = do resOrError <- liftIO $ H.session pool $ H.tx txSettings $ authenticated conf (app dbstructure conf body) req either (respond . errResponse) respond resOrError - - where - prettyVersion = intercalate "." $ map show $ versionBranch version