Experiment with making configuration type safe, self domummenting, easy to extend and dead-simple to use.
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