Supercharge Haskell configuration
TIL
593
Haskell
17
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.
20 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 hơn 2 năm trước
6 1
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 10 tháng trước
5 10
White
3 3
This post is a sample chapter from my (Link) How to render a ReactJS component isomorphically ? The trick is in defaultProps and componentDidM...
checkraiser viết 3 năm trước
3 3
Bài viết liên quan
White
0 2
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 tháng trước
0 2
White
19 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết gần 2 năm trước
19 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
17 bài viết.
20 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á!