Skip to content

Commit 4081f19

Browse files
vrom911Dmitrii Kovanikov
authored and
Dmitrii Kovanikov
committed
[Holmusk#59] Introduce TOML config (Holmusk#65)
* [Holmusk#59] Introduce TOML config Resolves Holmusk#59 * Fix Stack build
1 parent b20a6ee commit 4081f19

File tree

7 files changed

+44
-12
lines changed

7 files changed

+44
-12
lines changed

config.toml

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
dbCredentials = "host=localhost port=5432 user=root dbname=three-layer"
2+
log.severity = "Debug"

src/Lib.hs

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Servant.Server (serve)
99
import System.Remote.Monitoring (forkServerWith)
1010

1111
import Lib.App (AppEnv, Env (..))
12+
import Lib.Config (Config (..), loadConfig)
1213
import Lib.Core.Jwt (JwtSecret (..), mkRandomString)
1314
import Lib.Db (initialisePool)
1415
import Lib.Effects.Log (mainLogAction)
@@ -17,10 +18,10 @@ import Lib.Server (API, server)
1718
import qualified Data.HashMap.Strict as HashMap
1819
import qualified System.Metrics as Metrics
1920

20-
mkAppEnv :: IO AppEnv
21-
mkAppEnv = do
21+
mkAppEnv :: Config -> IO AppEnv
22+
mkAppEnv Config{..} = do
2223
-- IO configuration
23-
envDbPool <- initialisePool
24+
envDbPool <- initialisePool cDbCredentials
2425
envSessions <- newMVar HashMap.empty
2526
envTimings <- newIORef HashMap.empty
2627
envEkgStore <- Metrics.newStore
@@ -29,7 +30,7 @@ mkAppEnv = do
2930

3031
-- pure configuration
3132
let envSessionExpiry = 600
32-
let envLogAction = mainLogAction D
33+
let envLogAction = mainLogAction cLogSeverity
3334
pure Env{..}
3435

3536
runServer :: AppEnv -> IO ()
@@ -42,4 +43,4 @@ runServer env@Env{..} = do
4243
application = serve (Proxy @API) (server env)
4344

4445
main :: IO ()
45-
main = mkAppEnv >>= runServer
46+
main = loadConfig >>= mkAppEnv >>= runServer

src/Lib/Config.hs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{- | Configurations through the @config.toml@ file@.
2+
-}
3+
4+
module Lib.Config
5+
( Config (..)
6+
, loadConfig
7+
) where
8+
9+
import Toml (TomlCodec, (.=))
10+
11+
import qualified Toml
12+
13+
14+
-- | Data type for the configurable elements of the application.
15+
data Config = Config
16+
{ cDbCredentials :: !ByteString
17+
, cLogSeverity :: !Severity
18+
}
19+
20+
-- | TOML codec for the 'Config' data type.
21+
configT :: TomlCodec Config
22+
configT = Config
23+
<$> Toml.byteString "dbCredentials" .= cDbCredentials
24+
<*> Toml.read "log.severity" .= cLogSeverity
25+
26+
-- | Loads the @config.toml@ file.
27+
loadConfig :: MonadIO m => m Config
28+
loadConfig = Toml.decodeFile configT "config.toml"

src/Lib/Db/Functions.hs

+2-6
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,8 @@ import qualified Database.PostgreSQL.Simple as Sql
2828
type WithDb env m = (MonadReader env m, Has DbPool env, MonadIO m)
2929

3030
-- | Create 'Pool.Pool' by given credentials.
31-
initialisePool :: IO DbPool
32-
initialisePool = Pool.createPool (Sql.connectPostgreSQL credentials) Sql.close 10 5 10
33-
where
34-
-- TODO: put into TOML config
35-
credentials :: ByteString
36-
credentials = "host=localhost port=5432 user=root dbname=three-layer"
31+
initialisePool :: ByteString -> IO DbPool
32+
initialisePool credentials = Pool.createPool (Sql.connectPostgreSQL credentials) Sql.close 10 5 10
3733

3834
-- | Performs a query without arguments and returns the resulting rows.
3935
queryRaw

stack.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ extra-deps:
1515
- servant-0.16.0.1
1616
- servant-server-0.16
1717
- servant-proto-lens-0.1.0.3
18+
- tomland-1.0.0
1819
- typerep-map-0.3.2

test/Spec.hs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Test.Hspec.Core.Spec (sequential)
88

99
import Lib (mkAppEnv)
1010
import Lib.App (AppEnv, Env (..))
11+
import Lib.Config (loadConfig)
1112
import Lib.Db (prepareDb)
1213
import Lib.Effects.Log (runAppLogIO_)
1314

@@ -35,7 +36,7 @@ hedgehogTests = Group "Roundtrip properties"
3536

3637
main :: IO ()
3738
main = bracket
38-
mkAppEnv
39+
(loadConfig >>= mkAppEnv)
3940
(\Env{..} -> Pool.destroyAllResources envDbPool)
4041
runTests
4142
where

three-layer.cabal

+3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ library
7272
Lib.App.Error
7373
Lib.App.Monad
7474

75+
Lib.Config
76+
7577
-- core modules
7678
Lib.Core.Admin
7779
Lib.Core.Email
@@ -133,6 +135,7 @@ library
133135
, servant-server ^>= 0.16
134136
, text
135137
, time >= 1.8 && < 1.10
138+
, tomland ^>= 1.0.0
136139
, unordered-containers
137140
, warp ^>= 3.2
138141

0 commit comments

Comments
 (0)