salak-0.2.9.2: Configuration Loader

Copyright(c) 2019 Daniel YU
LicenseBSD3
Maintainerleptonyu@gmail.com
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Salak

Contents

Description

Configuration Loader for Production in Haskell.

Synopsis

How to use this library

| 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 priority, priorities cannot be changed.

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 = runSalakWith "salak" (YAML :|: TOML) $ do
  c :: Config <- require "test.config"
  lift $ print c

GHCi play

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

Salak Main Functions

loadAndRunSalak Source #

Arguments

:: MonadIO m 
=> LoadSalakT m ()

Load properties monad.

-> RunSalakT m a

Fetch properties monad.

-> m a 

Load and run salak SourcePack and fetch properties.

runSalak :: MonadIO m => PropConfig -> RunSalakT m a -> m a Source #

Default run salak. All these configuration sources has orders, from highest priority to lowest priority:

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.

runSalakWith :: (HasLoad file, MonadIO m) => String -> file -> RunSalakT m a -> m a Source #

Simplified run salak, should specified code name and file format.

data PropConfig Source #

Prop load configuration

Constructors

PropConfig 

Fields

Instances
Default PropConfig Source # 
Instance details

Defined in Salak

Methods

def :: PropConfig #

Load Salak

data LoadSalakT m a Source #

Load Salak Monad Transfer

Instances
MonadTrans LoadSalakT Source # 
Instance details

Defined in Salak.Types

Methods

lift :: Monad m => m a -> LoadSalakT m a #

Monad m => Monad (LoadSalakT m) Source # 
Instance details

Defined in Salak.Types

Methods

(>>=) :: LoadSalakT m a -> (a -> LoadSalakT m b) -> LoadSalakT m b #

(>>) :: LoadSalakT m a -> LoadSalakT m b -> LoadSalakT m b #

return :: a -> LoadSalakT m a #

fail :: String -> LoadSalakT m a #

Functor m => Functor (LoadSalakT m) Source # 
Instance details

Defined in Salak.Types

Methods

fmap :: (a -> b) -> LoadSalakT m a -> LoadSalakT m b #

(<$) :: a -> LoadSalakT m b -> LoadSalakT m a #

Monad m => Applicative (LoadSalakT m) Source # 
Instance details

Defined in Salak.Types

Methods

pure :: a -> LoadSalakT m a #

(<*>) :: LoadSalakT m (a -> b) -> LoadSalakT m a -> LoadSalakT m b #

liftA2 :: (a -> b -> c) -> LoadSalakT m a -> LoadSalakT m b -> LoadSalakT m c #

(*>) :: LoadSalakT m a -> LoadSalakT m b -> LoadSalakT m b #

(<*) :: LoadSalakT m a -> LoadSalakT m b -> LoadSalakT m a #

MonadIO m => MonadIO (LoadSalakT m) Source # 
Instance details

Defined in Salak.Types

Methods

liftIO :: IO a -> LoadSalakT m a #

Monad m => HasSourcePack (LoadSalakT m) Source # 
Instance details

Defined in Salak

loadCommandLine :: MonadIO m => ParseCommandLine -> LoadSalakT m () Source #

Load command line arguments into SourcePack

type ParseCommandLine = [String] -> IO [(Text, Priority -> Value)] Source #

Convert arguments to properties

defaultParseCommandLine :: ParseCommandLine Source #

Default way to parse command line arguments

loadEnv :: MonadIO m => LoadSalakT m () Source #

Load environment variables into SourcePack

loadMock :: Monad m => [(Text, Text)] -> LoadSalakT m () Source #

Put key value pairs into SourcePack

Load Extensions

type ExtLoad = (String, FilePath -> LoadSalakT IO ()) Source #

Load file by extension

loadByExt :: (HasLoad a, MonadIO m) => a -> FilePath -> LoadSalakT m () Source #

class HasLoad a where Source #

Methods

loaders :: a -> [ExtLoad] Source #

Instances
(HasLoad a, HasLoad b) => HasLoad (a :|: b) Source # 
Instance details

Defined in Salak

Methods

loaders :: (a :|: b) -> [ExtLoad] Source #

data a :|: b infixr 3 Source #

Constructors

a :|: b infixr 3 
Instances
(HasLoad a, HasLoad b) => HasLoad (a :|: b) Source # 
Instance details

Defined in Salak

Methods

loaders :: (a :|: b) -> [ExtLoad] Source #

Run Salak

data RunSalakT m a Source #

RunSalak Monad Transfer

Instances
MonadTrans RunSalakT Source # 
Instance details

Defined in Salak.Load.Dynamic

Methods

lift :: Monad m => m a -> RunSalakT m a #

Monad m => Monad (RunSalakT m) Source # 
Instance details

Defined in Salak.Load.Dynamic

Methods

(>>=) :: RunSalakT m a -> (a -> RunSalakT m b) -> RunSalakT m b #

(>>) :: RunSalakT m a -> RunSalakT m b -> RunSalakT m b #

return :: a -> RunSalakT m a #

fail :: String -> RunSalakT m a #

Functor m => Functor (RunSalakT m) Source # 
Instance details

Defined in Salak.Load.Dynamic

Methods

fmap :: (a -> b) -> RunSalakT m a -> RunSalakT m b #

(<$) :: a -> RunSalakT m b -> RunSalakT m a #

Monad m => Applicative (RunSalakT m) Source # 
Instance details

Defined in Salak.Load.Dynamic

Methods

pure :: a -> RunSalakT m a #

(<*>) :: RunSalakT m (a -> b) -> RunSalakT m a -> RunSalakT m b #

liftA2 :: (a -> b -> c) -> RunSalakT m a -> RunSalakT m b -> RunSalakT m c #

(*>) :: RunSalakT m a -> RunSalakT m b -> RunSalakT m b #

(<*) :: RunSalakT m a -> RunSalakT m b -> RunSalakT m a #

MonadIO m => MonadIO (RunSalakT m) Source # 
Instance details

Defined in Salak.Load.Dynamic

Methods

liftIO :: IO a -> RunSalakT m a #

MonadUnliftIO m => MonadUnliftIO (RunSalakT m) Source # 
Instance details

Defined in Salak.Load.Dynamic

Methods

askUnliftIO :: RunSalakT m (UnliftIO (RunSalakT m)) #

withRunInIO :: ((forall a. RunSalakT m a -> IO a) -> IO b) -> RunSalakT m b #

MonadIO m => HasSourcePack (RunSalakT m) Source # 
Instance details

Defined in Salak

liftNT :: Monad n => (forall x. m x -> n x) -> RunSalakT m a -> RunSalakT n a Source #

Get Static Properties

class Monad m => HasSourcePack m where Source #

Monad that can fetch properties.

Minimal complete definition

askSourcePack

Instances
Monad m => HasSourcePack (LoadSalakT m) Source # 
Instance details

Defined in Salak

MonadIO m => HasSourcePack (RunSalakT m) Source # 
Instance details

Defined in Salak

fetch Source #

Arguments

:: (HasSourcePack m, FromProp a) 
=> Text

Properties key

-> m (Either String a) 

Try fetch properties from SourcePack

require Source #

Arguments

:: (HasSourcePack m, FromProp a) 
=> Text

Properties key

-> m a 

Fetch properties from SourcePack, or throw fail

Dynamic Get Properties

data ReloadResult Source #

Constructors

ReloadResult 

Fields

  • isError :: Bool

    msg stands for properties changing record if true, otherwise msg means reload error.

  • msg :: [String]

    message log

Instances
Eq ReloadResult Source # 
Instance details

Defined in Salak.Load.Dynamic

Show ReloadResult Source # 
Instance details

Defined in Salak.Load.Dynamic

exec :: MonadIO m => (IO ReloadResult -> IO a) -> RunSalakT m a Source #

Run action in RunSalakT, IO ReloadResult is reloadable action.

requireD Source #

Arguments

:: (MonadIO m, FromProp a) 
=> Text

Properties key

-> RunSalakT m (IO a) 

Fetch dynamic properties from SourcePack, or throw fail

Parse properties

data SourcePack Source #

Source package, used to store all properties.

Instances
Show SourcePack Source # 
Instance details

Defined in Salak.Types

MonadReader SourcePack Prop Source # 
Instance details

Defined in Salak.Prop

Methods

ask :: Prop SourcePack #

local :: (SourcePack -> SourcePack) -> Prop a -> Prop a #

reader :: (SourcePack -> a) -> Prop a #

data Value Source #

Instances
Eq Value Source # 
Instance details

Defined in Salak.Types.Value

Methods

(==) :: Value -> Value -> Bool #

(/=) :: Value -> Value -> Bool #

Ord Value Source # 
Instance details

Defined in Salak.Types.Value

Methods

compare :: Value -> Value -> Ordering #

(<) :: Value -> Value -> Bool #

(<=) :: Value -> Value -> Bool #

(>) :: Value -> Value -> Bool #

(>=) :: Value -> Value -> Bool #

max :: Value -> Value -> Value #

min :: Value -> Value -> Value #

Show Value Source # 
Instance details

Defined in Salak.Types.Value

Methods

showsPrec :: Int -> Value -> ShowS #

show :: Value -> String #

showList :: [Value] -> ShowS #

Show Source Source # 
Instance details

Defined in Salak.Types.Source

type Prop = PropT PResult Source #

Monad used to parse properties to destination type.

class FromProp a where Source #

Minimal complete definition

Nothing

Methods

fromProp :: Prop a Source #

fromProp :: (Generic a, GFromProp (Rep a)) => Prop a Source #

Instances
FromProp Bool Source # 
Instance details

Defined in Salak.Prop

FromProp Double Source # 
Instance details

Defined in Salak.Prop

FromProp Float Source # 
Instance details

Defined in Salak.Prop

FromProp Int Source # 
Instance details

Defined in Salak.Prop

FromProp Int8 Source # 
Instance details

Defined in Salak.Prop

FromProp Int16 Source # 
Instance details

Defined in Salak.Prop

FromProp Int32 Source # 
Instance details

Defined in Salak.Prop

FromProp Int64 Source # 
Instance details

Defined in Salak.Prop

FromProp Integer Source # 
Instance details

Defined in Salak.Prop

FromProp Word Source # 
Instance details

Defined in Salak.Prop

FromProp Word8 Source # 
Instance details

Defined in Salak.Prop

FromProp Word16 Source # 
Instance details

Defined in Salak.Prop

FromProp Word32 Source # 
Instance details

Defined in Salak.Prop

FromProp Word64 Source # 
Instance details

Defined in Salak.Prop

FromEnumProp a => FromProp a Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop a Source #

FromProp ByteString Source # 
Instance details

Defined in Salak.Prop

FromProp ByteString Source # 
Instance details

Defined in Salak.Prop

FromProp Text Source # 
Instance details

Defined in Salak.Prop

FromProp Text Source # 
Instance details

Defined in Salak.Prop

FromProp String Source # 
Instance details

Defined in Salak.Prop

FromProp CShort Source # 
Instance details

Defined in Salak.Prop

FromProp CUShort Source # 
Instance details

Defined in Salak.Prop

FromProp CInt Source # 
Instance details

Defined in Salak.Prop

FromProp CUInt Source # 
Instance details

Defined in Salak.Prop

FromProp CLong Source # 
Instance details

Defined in Salak.Prop

FromProp CULong Source # 
Instance details

Defined in Salak.Prop

FromProp CLLong Source # 
Instance details

Defined in Salak.Prop

FromProp CULLong Source # 
Instance details

Defined in Salak.Prop

FromProp CBool Source # 
Instance details

Defined in Salak.Prop

FromProp CFloat Source # 
Instance details

Defined in Salak.Prop

FromProp CDouble Source # 
Instance details

Defined in Salak.Prop

FromProp Scientific Source # 
Instance details

Defined in Salak.Prop

FromProp ZonedTime Source # 
Instance details

Defined in Salak.Prop

FromProp LocalTime Source # 
Instance details

Defined in Salak.Prop

FromProp TimeOfDay Source # 
Instance details

Defined in Salak.Prop

FromProp UTCTime Source # 
Instance details

Defined in Salak.Prop

FromProp NominalDiffTime Source # 
Instance details

Defined in Salak.Prop

FromProp DiffTime Source # 
Instance details

Defined in Salak.Prop

FromProp Day Source # 
Instance details

Defined in Salak.Prop

FromProp a => FromProp [a] Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop [a] Source #

FromProp a => FromProp (Maybe a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Maybe a) Source #

FromProp a => FromProp (Min a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Min a) Source #

FromProp a => FromProp (Max a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Max a) Source #

FromProp a => FromProp (First a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (First a) Source #

FromProp a => FromProp (Last a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Last a) Source #

FromProp a => FromProp (Option a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Option a) Source #

FromProp a => FromProp (Identity a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Identity a) Source #

FromProp a => FromProp (Dual a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Dual a) Source #

FromProp a => FromProp (Sum a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Sum a) Source #

FromProp a => FromProp (Product a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (Product a) Source #

FromProp a => FromProp (Either String a) Source # 
Instance details

Defined in Salak.Prop

(FromProp a, FromProp b) => FromProp (a, b) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b) Source #

(FromProp a, FromProp b, FromProp c) => FromProp (a, b, c) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c) Source #

(FromProp a, FromProp b, FromProp c, FromProp d) => FromProp (a, b, c, d) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c, d) Source #

(FromProp a, FromProp b, FromProp c, FromProp d, FromProp e) => FromProp (a, b, c, d, e) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c, d, e) Source #

(FromProp a, FromProp b, FromProp c, FromProp d, FromProp e, FromProp f) => FromProp (a, b, c, d, e, f) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c, d, e, f) Source #

(FromProp a, FromProp b, FromProp c, FromProp d, FromProp e, FromProp f, FromProp g) => FromProp (a, b, c, d, e, f, g) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c, d, e, f, g) Source #

(FromProp a, FromProp b, FromProp c, FromProp d, FromProp e, FromProp f, FromProp g, FromProp h) => FromProp (a, b, c, d, e, f, g, h) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c, d, e, f, g, h) Source #

(FromProp a, FromProp b, FromProp c, FromProp d, FromProp e, FromProp f, FromProp g, FromProp h, FromProp i) => FromProp (a, b, c, d, e, f, g, h, i) Source # 
Instance details

Defined in Salak.Prop

Methods

fromProp :: Prop (a, b, c, d, e, f, g, h, i) Source #

class FromEnumProp a where Source #

readPrimitive :: ([Selector] -> Value -> PResult a) -> Prop a Source #

ReadPrimitive value

data PResult a Source #

Constructors

O [Selector] a

Succeed value

N [Selector]

Empty value

F [Selector] String

Fail value

Instances
Monad PResult Source # 
Instance details

Defined in Salak.Prop

Methods

(>>=) :: PResult a -> (a -> PResult b) -> PResult b #

(>>) :: PResult a -> PResult b -> PResult b #

return :: a -> PResult a #

fail :: String -> PResult a #

Functor PResult Source # 
Instance details

Defined in Salak.Prop

Methods

fmap :: (a -> b) -> PResult a -> PResult b #

(<$) :: a -> PResult b -> PResult a #

Applicative PResult Source # 
Instance details

Defined in Salak.Prop

Methods

pure :: a -> PResult a #

(<*>) :: PResult (a -> b) -> PResult a -> PResult b #

liftA2 :: (a -> b -> c) -> PResult a -> PResult b -> PResult c #

(*>) :: PResult a -> PResult b -> PResult b #

(<*) :: PResult a -> PResult b -> PResult a #

Alternative PResult Source # 
Instance details

Defined in Salak.Prop

Methods

empty :: PResult a #

(<|>) :: PResult a -> PResult a -> PResult a #

some :: PResult a -> PResult [a] #

many :: PResult a -> PResult [a] #

HasValid Prop Source # 
Instance details

Defined in Salak.Prop

Methods

invalid :: HasI18n a => a -> Prop b #

mark :: String -> Prop a -> Prop a #

MonadReader SourcePack Prop Source # 
Instance details

Defined in Salak.Prop

Methods

ask :: Prop SourcePack #

local :: (SourcePack -> SourcePack) -> Prop a -> Prop a #

reader :: (SourcePack -> a) -> Prop a #

Eq a => Eq (PResult a) Source # 
Instance details

Defined in Salak.Prop

Methods

(==) :: PResult a -> PResult a -> Bool #

(/=) :: PResult a -> PResult a -> Bool #

Show a => Show (PResult a) Source # 
Instance details

Defined in Salak.Prop

Methods

showsPrec :: Int -> PResult a -> ShowS #

show :: PResult a -> String #

showList :: [PResult a] -> ShowS #

FromProp a => IsString (Prop a) Source # 
Instance details

Defined in Salak.Prop

Methods

fromString :: String -> Prop a #

(.?=) :: Alternative f => f a -> a -> f a infixl 5 Source #

Optional value.

(.?:) :: (Alternative f, Default b) => f a -> (b -> a) -> f a infixl 5 Source #

Default value.