Supercharge Haskell configuration
TIL
720
Haskell
18
White

checkraiser viết ngày 23/06/2018

Supercharge Haskell configuration

Với sự ra đời của dự án dhall-lang , việc xử lý cấu hình của bạn đã trở nên cực kỳ đơn giản.

Kết hợp với dotenvlens, bạn có thể cấu hình dự án Haskell trong vài nốt nhạc .

Env.hs

module Env(loadEnv) where

import qualified Configuration.Dotenv       as Dotenv
import qualified Configuration.Dotenv.Types as DotenvTypes

loadEnv :: IO ()
loadEnv = Dotenv.loadFile DotenvTypes.defaultConfig

Config.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}

module Config where

import           Control.Applicative.Alternative ((<|>))
import qualified Control.Exception               as E
import           Control.Lens
import qualified Data.Text                       as T
import qualified Data.Text.IO                    as TIO
import qualified Data.Text.Lazy                  as TL
import qualified Dhall                           as D

data DatabaseCfg = DatabaseCfg {
  _host     :: T.Text,
  _port     :: Integer,
  _username :: T.Text,
  _password :: T.Text,
  _database :: T.Text,
  _adapter  :: T.Text
} deriving (D.Generic, Show)

makeLenses ''DatabaseCfg
instance D.Interpret DatabaseCfg

newtype AppCfg = AppCfg {
  _databaseCfg :: DatabaseCfg
} deriving (D.Generic, Show)

makeLenses ''AppCfg
instance D.Interpret AppCfg

parseCfg :: FilePath -> IO AppCfg
parseCfg path = D.input D.auto =<< TL.pack <$> readFile path


tryParse = do
  args <- (<|>) <$> Env.getArgs <*> pure ["config.dhall"]
  E.catch (parseCfg $ head args) errorHandler

errorHandler (E.SomeException msg) = error "Config error"

Giả sử file cấu hình là config.dhall có nội dung:

{
  _databaseCfg = ./config/database
}

Cấu hình cho database đặt ở config/database có nội dung:

{ _host = "localhost",
  _port = 5432,
  _username = env:DATABASE_USERNAME as Text,
  _password = env:DATABASE_PASSWORD as Text,
  _database = env:DATABASE as Text,
  _adapter = env:ADAPTER as Text
}

Test ở ghci:

loadEnv
parseCfg "config.dhall" >>= print

sẽ cho ta kết quả:

AppCfg {_databaseCfg = DatabaseCfg {_host = "localhost", _port = 5432, _username = "username", _password = "password", _database = "db/mycounter1.sqlite", _adapter = "sqlite"}}

Rất tiện, phải không ?

checkraiser 23-06-2018

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

checkraiser

17 bài viết.
22 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
6 1
Tôi dự sẽ viết 1 loạt series về việc thiết kế 1 ứng dụng Rails như thế nào để nó có thể giúp bạn ăn ngon ngủ yên trong hằng năm trời: Khi mà việc t...
checkraiser viết gần 4 năm trước
6 1
White
5 0
Bài viết này, là 1 quan điểm cá nhân trong việc viết Code các layer trong Rails của mình. Controller Trước khi code, bạn hãy đặt câu hỏi: Mục đí...
checkraiser viết 3 năm trước
5 0
White
5 10
Cũng ngót nghét đi làm hơn 6 năm rồi, mình chỉ thấy một điều khá "ngược đời": Các ông chủ , những người trả tiền cho bạn lại có tư duy lập trình ké...
checkraiser viết gần 2 năm trước
5 10
Bài viết liên quan
White
0 4
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 1 năm trước
0 4
White
2 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 7 tháng trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
17 bài viết.
22 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!