salak: Configuration Loader

[ configuration, library, mit, program ] [ Propose Tags ]

[Skip to Readme]
Versions [faq] 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9, 0.1.10, 0.1.11, 0.2.0, 0.2.1, 0.2.2, 0.2.3, 0.2.4, 0.2.5, 0.2.6, 0.2.7, 0.2.8, 0.2.9, 0.2.9.1, 0.2.9.2, 0.2.9.3, 0.2.10, 0.3, 0.3.1, 0.3.2, 0.3.3, 0.3.3.1, 0.3.3.2, 0.3.4, 0.3.4.1, 0.3.5, 0.3.5.1, 0.3.5.2, 0.3.5.3 (info)
Dependencies attoparsec (>=0.13.2.2 && <0.14), base (>=4.10 && <5), containers (>=0.6.0.1 && <0.7), data-default (>=0.7.1.1 && <0.8), directory (>=1.3.3.0 && <1.4), filepath (>=1.4.2.1 && <1.5), menshen (>=0.0.2 && <0.1), mtl (>=2.2.2 && <2.3), pqueue (>=1.4.1.2 && <1.5), scientific (>=0.3.6.2 && <0.4), text (>=1.2.3.1 && <1.3), time (>=1.8.0.2 && <1.9) [details]
License BSD-3-Clause
Copyright (c) 2018 Daniel YU
Author Daniel YU
Maintainer Daniel YU <leptonyu@gmail.com>
Category Library, Configuration
Home page https://github.com/leptonyu/salak#readme
Uploaded by leptonyu at Mon Apr 1 12:25:25 UTC 2019
Distributions LTSHaskell:0.3.5.2, NixOS:0.3.5.3, Stackage:0.3.5.2
Downloads 5116 total (436 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for salak-0.2.7

[back to package description]

salak

Hackage stackage LTS package stackage Nightly package Build Status

Configuration (re)loader in Haskell.

salak-yaml

salak-yaml

salak-toml

salak-toml

This library define a universal procedure to load configurations and parse properties, also supports reload configuration files.

We can load configurations from command line, environment, configuration files such as yaml or toml etc, and we may want to have our own strategies to load configurations from multi sources and overwrite properties by orders of these sources.

PropConfig defines a common loading strategy:

  1. loadCommandLine
  2. loadEnvironment
  3. loadConfFiles
  4. load file from folder salak.conf.dir if defined
  5. load file from current folder if enabled
  6. load file from home folder if enabled
  7. file extension matching, support yaml or toml or any other loader.

Load earlier has higher orders, orders cannot be changed.

ReaderT SourcePack m defines how to read properties:

require "abc.prop"

ReloadableSourcePackT m defines how to read reloadable properties:

requireD "abc.dynamic.prop"

For commandline and environment,

CommandLine:  --package.a.enabled=true
Environment: PACKAGE_A_ENABLED: false

Usage:

Environment:

export TEST_CONFIG_NAME=daniel

Current Directory: salak.yaml

test.config:
  name: noop
  dir: ls

Current Directory: salak.toml

[test.config]
ext=2
data Config = Config
  { name :: Text
  , dir  :: Maybe Text
  , ext  :: Int
  } deriving (Eq, Show)

instance FromProp Config where
  fromProp = Config
    <$> "user" ? pattern "[a-z]{5,16}"
    <*> "pwd"
    <*> "ext" .?= 1

main = runSalak def { configName = Just "salak", loadExt = loadByExt $ YAML :|: TOML } $ do
  c :: Config <- require "test.config"
  lift $ print c

GHCi play

λ> import Salak
λ> import Salak.Load.YAML
λ> import Salak.Load.TOML
λ> import Data.Menshen
λ> :set -XTypeApplications
λ> instance FromProp Config where fromProp = Config <$> "user" <*> "dir" <*> "ext" .?= 1
λ> f = runSalak def { configName = Just "salak", loadExt = loadByExt $ YAML :|: TOML }
λ> f (require "") >>= print @Config
Config {name = "daniel", dir = Just "ls", ext = 2}

TODO:

  • Add git pull support.