Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/chris-huxtable/config.cr

Easy to use configuration and parser.
https://github.com/chris-huxtable/config.cr

configuration crystal-lang crystal-language shards

Last synced: about 2 months ago
JSON representation

Easy to use configuration and parser.

Awesome Lists containing this project

README

        

# config.cr
[![Docs](https://img.shields.io/badge/docs-available-brightgreen.svg)](https://chris-huxtable.github.io/config.cr/)
[![GitHub release](https://img.shields.io/github/release/chris-huxtable/config.cr.svg)](https://github.com/chris-huxtable/config.cr/releases)
[![Build Status](https://travis-ci.org/chris-huxtable/config.cr.svg?branch=master)](https://travis-ci.org/chris-huxtable/config.cr)

`config.cr` is a parser for a configuration format designed to be more effective than JSON, YAML, INI, and HJSON. It also inherits aspects from 'OpenBSD style' configs like macros.

```
# TL;DR
$self = config.cr

json: Too many quotes
yaml: Pays attention to whitespace
ini: No nesting
hjson: Data oriented. Support?
openbsd: Macros are awesome

/* If only something combined the good
parts and got rid of the bad */

answer: $self
```

## Installation

Add this to your application's `shard.yml`:

```yaml
dependencies:
config:
github: chris-huxtable/config.cr
```

## Usage

```crystal
require "config"
```

You can parse a file with:
```crystal
config = Config.file("/path/to/file.conf")
```

You can access the entries via the `Config::Any` objects.
```crystal
config = Config.parse("username: chris, link: https://github.com/chris-huxtable/config.cr")

username = config.as_s("username")
link = config.as_a("link")
```

## Format

### Root Object:
The root is considered an object. That is to say you must provide a key for any root entry and you should not wrap entries in `{}`.
```
key: "value"
```

### Keys:
Unlike JSON, object keys can be specified without quotes.
```
rate: 1000
```

### Strings:
Unlike JSON, strings can be specified without quotes as long as it doesn't contain special characters like `:`, `=`, `{`, `}`, `[`, `]`, or `,`. Though, `:`, `=` are allowed if they are not a key.
```
rate: This is a string.
```

### Separators:
Unlike JSON, entries can be separated with commas or newlines.
```
first: 1
second: 2, third: 3
```

### Comments:
There are three types of comments to support the common commenting styles.

#### Hash Comments:
A to-end-of-line comment initiated by a `#` symbol. As common in Crystal, Ruby, Python, Shell, Perl, et al.
```
# hash style comments
# (because it's just one character)
```

#### Line Comments:
A to-end-of-line comment initiated by a `//`. As common in C, Objective-C, C++, D, Swift, PHP, JavaScript, et al.
```
// line style comments
// (because it's like C/Objective-C/...)
```

#### Block Comments:
A block comment initiated by a `/*` and terminated by `*/`. As common in C, Objective-C, C++, D, Swift, PHP, et al.
```
/* block style comments because
it allows you to comment out a block */
```
Note: This does not *yet* support nested comments.

### Macros:
A macro is a saved value which can be referenced in the rest fo the document. The key must be prefixed with a `$` and assigned with a `=` as opposed to a `:`.
```
$defaultName = "Default Name"
$nameKey = name

$defaultObject = {
first: 1
second: 2
}

$nameKey: $defaultName
object: $defaultObject
```

Note: Macro's cannot yet be inserted into strings.

### Fault Tolerance:
Recovers from easy to make mistakes. Like useless commas.
```
first: 1
second: 2,
third: 3,,,
```

## Contributing

1. Fork it ( https://github.com/chris-huxtable/config.cr/fork )
2. Create your feature branch (git checkout -b my-new-feature)
3. Commit your changes (git commit -am 'Add some feature')
4. Push to the branch (git push origin my-new-feature)
5. Create a new Pull Request

## Contributors

- [Chris Huxtable](https://github.com/chris-huxtable) - creator, maintainer