config-parser-0.2.0.0: Parse config files using parsec and generate parse errors on unhandled keys

Copyright(c) Ben Hamlin 2017
LicenseMIT
Maintainerprotob3n@gmail.com
Stabilityexperimental
PortabilityPOSIX
Safe HaskellSafe
LanguageHaskell2010

Text.ConfigParser

Description

This is yet another entry in Haskell's enourmous collection of config-file parsing libraries. It lacks many of the bells and whistles of other config-file parsing libraries, such as hierarchical sections and on-the-fly reloading. On the other hand, it has a combination of features I was unable to find in other libraries:

  • Keys and values are parsed with configurable parsec parsers, resulting in flexible syntax and pretty error messages.
  • Custom parsers can be created with parsec to handle values of any type.
  • Keys that aren't explicitly handled result in parse errors.

If you don't need all of these features, there are probably better libraries out there for you. If you're free to use its idiosyncratic file format, the config-value library, in particular, is excelent.

Example:

By default, this library parses flat config like the following:

a_string = "blah, blah, blah\nmore blah"
a_number = 9001
a_list   = [1,2,3,4,5]
# This is a comment

If you wanted to parse the above file, saved as ./config.txt, you might do so as follows:

import Text.ConfigParser

cp :: ConfigParser (Maybe String, Maybe Integer, [Integer])
cp = configParser (Nothing, Nothing, [])
    [ ConfigOption
        { key    = "a_string"
        , parser = string
        , action = \s (_,n,ns) -> (Just s, n, ns)
        }
    , ConfigOption
        { key    = "a_number"
        , parser = integer
        , action = \n (s,_,ns) -> (s, Just n, ns)
        }
    , ConfigOption
        { key    = "a_list"
        , parser = list integer
        , action = \ns (s,n,_) -> (s, n, ns)
        }
    ]

main :: IO ()
main = parseFromFile cp "./config.txt" >>= print

Synopsis

Documentation

data ConfigOption c Source #

Constructors

ConfigOption 

Fields

  • key :: Key

    Key name.

  • parser :: Parser a

    Parser for the given value type.

  • action :: a -> c -> c

    How the value should change the state c.

data ConfigParser c Source #

Parameters for a parser that takes a config file and produces a c. Use the configParser_ constructor if you want to specify your own lineParser or commentStart. Otherwise, use the configParser smart constructor.

configParser_ :: (forall a. Key -> Parser a -> Parser a) -> [String] -> c -> [ConfigOption c] -> ConfigParser c Source #

Smart constructor to check that options doesn't contain any duplicate keys before creating a ConfigParser.

configParser :: c -> [ConfigOption c] -> ConfigParser c Source #

Smart constructor for a ConfigParser that uses a default syntax like key = value and line comments starting with #.

defaultKeyValue :: Key -> Parser a -> Parser a Source #

Default syntax like key = value.

defaultLineCommentInit :: [String] Source #

Default line comment like # comment text.

string :: IsString s => Parser s Source #

Parse a string surrounded by quotes. Quotes within the string must be escaped with backslashes.

integer :: Parser Integer Source #

Parse an integer.

bool :: Parser Bool Source #

Parse a boolean. Valid synonyms for True are true, yes, Yes, on, and On. Valid synonyms for False are false, no, No, off, and Off.

list :: Parser a -> Parser [a] Source #

Parse a list of values surrounded by [ and ], and separated by commas. The list can contain whitespace and newlines.