config-schema: Schema definitions for the config-value package

[ language, library ] [ Propose Tags ]

This package makes it possible to defined schemas for use when loading configuration files using the config-value format. These schemas can be used to be process a configuration file into a Haskell value, or to automatically generate documentation for the file format.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0, 0.2.0.0, 0.3.0.0, 0.3.1.0, 0.3.1.1, 0.4.0.0, 0.4.1.0, 0.5.0.0, 0.5.0.1, 1.0.0.0, 1.1.0.0, 1.2.0.0, 1.2.1.0, 1.2.2.0, 1.3.0.0
Change log ChangeLog.md
Dependencies base (>=4.9 && <4.11), config-value (>=0.5 && <0.6), containers (>=0.5 && <0.6), free (>=4.12 && <4.13), kan-extensions (>=5.0 && <5.1), semigroupoids (>=5.2 && <5.3), text (>=1.2 && <1.3), transformers (>=0.5 && <0.6) [details]
License ISC
Copyright Eric Mertens 2017
Author Eric Mertens
Maintainer emertens@gmail.com
Category Language
Home page https://github.com/glguy/config-schema
Bug tracker https://github.com/glguy/config-schema/issues
Source repo head: git clone https://github.com/glguy/config-schema
Uploaded by EricMertens at 2017-05-07T04:06:42Z
Distributions Arch:1.3.0.0, Debian:1.2.0.0, NixOS:1.3.0.0
Reverse Dependencies 3 direct, 1 indirect [details]
Downloads 10647 total (73 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for config-schema-0.1.0.0

[back to package description]

config-schema

Hackage Build Status

This package allows the user to define configuration schemas suitable for matching against configuration files written in the config-value format. These schemas allow the user to extract an arbitrary Haskell value from an interpretation of a configuration file. It also allows the user to programatically generate documentation for the configuration files accepted by the loader.

{-# Language OverloadedStrings, ApplicativeDo #-}

module Example where

import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import           Data.Text (Text)
import           Data.Monoid ((<>))
import           Data.Functor.Alt ((<!>))

import           Config
import           Config.Schema

exampleFile :: Text
exampleFile =
  " name: \"Johny Appleseed\" \n\
  \ age : 99                  \n\
  \ happy: yes                \n\
  \ kids:                     \n\
  \   * name: \"Bob\"         \n\
  \   * name: \"Tom\"         \n"

exampleValue :: Value
Right exampleValue = parse exampleFile

exampleSpec :: ValueSpecs Text
exampleSpec = sectionsSpec "" $
  do name  <- reqSection  "name" "Full name"
     age   <- reqSection  "age"  "Age of user"
     happy <- optSection' "happy" "Current happiness status" yesOrNo
     kids  <- reqSection' "kids"  "All children" (oneOrList kidSpec)

     return $
       let happyText = case happy of Just True  -> " and is happy"
                                     Just False -> " and is not happy"
                                     Nothing    -> " and is private"

       in name <> " is " <> Text.pack (show (age::Integer)) <>
             " years old and has kids " <>
             Text.intercalate ", " kids <>
             happyText

kidSpec :: ValueSpecs Text
kidSpec = sectionsSpec "kid" (reqSection "name" "Kid's name")


-- | Matches the 'yes' and 'no' atoms
yesOrNo :: ValueSpecs Bool
yesOrNo = True  <$ atomSpec "yes" <!>
          False <$ atomSpec "no"


printDoc :: IO ()
printDoc = Text.putStr (generateDocs exampleSpec)
-- *Example> printDoc
-- Configuration file fields:
--     name: REQUIRED text
--        Full name
--     age: REQUIRED integer
--        Age of user
--     happy: `yes` or `no`
--        Current happiness status
--     kids: REQUIRED kid or list of kid
--        All children
--
-- kid
--     name: REQUIRED text
--        Kid's name

example :: Either [LoadError] Text
example = loadValue exampleSpec exampleValue
-- *Example> exampleVal
-- Right "Johny Appleseed is 99 years old and has kids Bob, Tom and is happy"