Configuration file syntax and parsing for golang
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Brett Langdon c9dd35bf48
Handle eof in comments and do not prematurely close file handler
9 years ago
example add support for negative numbers 11 years ago
token Add support for lists 11 years ago
.travis.yml Remove Go 1.4 from Travis testing 10 years ago
CHANGELOG Update CHANGELOG 10 years ago
LICENSE Add license 11 years ago
Makefile add deps target to makefile 11 years ago
README.md Add support for lists 11 years ago
benchmark_test.go rename test config 11 years ago
example_test.go fix up examples 11 years ago
forge.go Allow integers in identifiers 10 years ago
forge_test.go Fix bug: syntax error with list with no ending semicolon 10 years ago
lint.sh add makefile and linting helper script 11 years ago
list.go Add support for lists 11 years ago
parser.go Handle eof in comments and do not prematurely close file handler 9 years ago
primative.go make sure to handle raw int's 11 years ago
primative_test.go add more tests 11 years ago
reference.go add reference struct 11 years ago
scanner.go Handle eof in comments and do not prematurely close file handler 9 years ago
section.go Expose 'value does not exists' error 9 years ago
section_test.go config lines formatted 10 years ago
test.cfg Fix bug: syntax error with list with no ending semicolon 10 years ago
test_include.cfg add include to test/benchmark config 11 years ago
value.go Add support for lists 11 years ago

README.md

forge

Build Status GoDoc

Forge is a configuration syntax and parser.

Installation

go get github.com/brettlangdon/forge

Documentation

Documentation can be viewed on godoc: https://godoc.org/github.com/brettlangdon/forge

Example

You can see example usage in the example folder.

# example.cfg

# Global directives
global = "global value";
# Primary section
primary {
  string = "primary string value";
  single = 'single quotes are allowed too';

  # Semicolons are optional
  integer = 500
  float = 80.80
  boolean = true
  negative = FALSE
  nothing = NULL

  list = [50.5, true, false, "hello", 'world'];

  # Include external files
  include "./include*.cfg";
  # Primary-sub section
  sub {
      key = "primary sub key value";
  }
}

# Secondary section
secondary {
  another = "secondary another value";
  global_reference = global;
  primary_sub_key = primary.sub.key;
  another_again = .another;  # References secondary.another
  _under = 50;
}
package main

import (
	"fmt"
	"json"

	"github.com/brettlangdon/forge"
)

func main() {
	// Parse a `SectionValue` from `example.cfg`
	settings, err := forge.ParseFile("example.cfg")
	if err != nil {
		panic(err)
	}

	// Get a single value
	if settings.Exists("global") {
		// Get `global` casted as a string
		value, _ := settings.GetString("global")
		fmt.Printf("global = \"%s\"\r\n", value)
	}

	// Get a nested value
	value, err := settings.Resolve("primary.included_setting")
	fmt.Printf("primary.included_setting = \"%s\"\r\n", value.GetValue())

	// You can also traverse down the sections manually
	primary, err := settings.GetSection("primary")
	strVal, err := primary.GetString("included_setting")
	fmt.Printf("primary.included_setting = \"%s\"\r\n", strVal)

	// Convert settings to a map
	settingsMap := settings.ToMap()
	fmt.Printf("global = \"%s\"\r\n", settingsMap["global"])

	// Convert settings to JSON
	jsonBytes, err := settings.ToJSON()
	fmt.Printf("\r\n\r\n%s\r\n", string(jsonBytes))
}

Issues/Requests?

Please feel free to open a github issue for any issues you have or any feature requests.