Skip to content

widmogrod/typed-config

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

70 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

typed-config

Build Status

Introduction

Experiment with making configuration type safe, self domummenting, easy to extend and dead-simple to use.

Work in progress

Predefined Types

Str
Int
Num
Bool
Binnary
List, Map, Set

Special types

URL
Path
Port
Password
SHA256
...

Defining new types in config.tcfg

type market = [a-z]{2}
type _name = str
type _number = int where int > 0

Using new types in config.yml

maximum_comments_number: 10
comments_enabled: Bool  """ default true[?]
comments_disabled: Bool """ default false[?]

Hinting types in key name:

comments_limit_int: 10

Validating configuration

  • finds invalid types
  • missing elements
// config.yml
tenant_options:
 - comments_limit_int: 10
   comments_enabled: true

 - comments_limit_int: -1.1
   comments_enabled: fals

 - comments_enabled: true

// cmd
typedconf validate config.yml
typedconf validate --format=yaml --config=config.yml --types=config.tcfg

// Output of invalid file looks like this

Problems:

        5   - comments_limit_int: -1.1
                                  ^^^^^

    Element "comment_limit_int" in list "tenant_options" at possition "1" has invalid value "-1.1", expected type "int" but "float" given


        6     comments_enabled: fals
                                ^^^^

    Element "comment_enabled" in list "tenant_options" at possition "1" has invalid value "fals", expected type "bool" but "string" given

Suggestions:


        8 - comments_enabled: true
            comment_limit_int: 0
            ^^^^^^^^^^^^^^^^ missing element?



    Element "comment_limit_int" in list "tenant_options" at possition "2"  is missing. Not symetric list element

Restructuring configuration

  • When declared configuration is not structurised
typedconf fix

Comparing configurations

  • When you wan to compare configuration A & B and see whenever types are maching
typedconf compare --a=new_config.yml --to=config.yml

Other options

typedconf help

  - init        - Create configuration file in current directory
  - validate    - Validate configuration file

        --format
        --config
        --types
        --output-hints-as =

  - types       - Extract types information from configuration and output information as json, xml, ...
  - generate    - Generate code from typed configuration to specific language....
  - compare     - Compare two configuration in therms of types
  - fix         - Apply suggested fixes to make configuration consistent
  - server      - For autocomplete suggestions, integration with VIM, and other code editors, IDEs

Grammar

expression = assigment
assigment = key ":" value

name = "a-z0-1"
key = name "_" type | name

value = value_inline | value_multiline
value_inline = * NOT("\n")
value_multiline = value_inline "\n"
value_list = "-" value
value_map  = assigment
site_name_str: "something"
site_name: "something"

comments_limit_int: 10
comments_number: 100

About

Experiment with making configuration type-safe, self-domummenting, and dead-simple to use.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages