Giter VIP home page Giter VIP logo

configo's Introduction

Configo

Configo is a go library to parse toml configuration using struct tags

Features

  • Configuring parser behaviour using struct tags
  • Setting default value or as required
  • Validating value using regex, range expression or named validator
  • Generating toml template with human friendly information based on go struct and tags
  • Building conf file generation tools using configo-build

QuickStart

  • Install configo-build tool for config generation

go get github.com/distributedio/configo/bin/configo-build

  • Define a struct in package conf
package conf

type Config struct {
        Listen  string `cfg:"listen; :8804; netaddr; The address the server to listen"`
        MaxConn int    `cfg:"max-connection; 10000; numeric; Max number of concurrent connections"`
        Redis   struct {
                Cluster []string `cfg:"cluster; required; dialstring; The addresses of redis cluster"`
        }
}
  • Use configo-build tool generate config builder, if everything goes well, you'll get a binary called conf.Config.cfg

configo-build ./conf.Config

or use the absolute path

configo-build github.com/distributedio/configo/example/conf.Config

  • execute builer to generate a toml

conf.config.cfg > conf.toml

or patch you toml file if it is already existed

conf.config.cfg -patch conf.toml

  • Use your config in your code
import "github.com/distributedio/configo"

var conf conf.Config

if err := configo.Parse("{PATH_TO_YOUR_TOML}", &conf) ;err != nil {
// handle the error
}

Toml

shafreeck/toml is a modification version of naoina/toml, adding the abililty to parse complex struct tags and with bugs fixed.

Validation

configo has a builtin validator with regex and range support

Supported named validator

  • netaddr
  • url
  • nonempty
  • dialstring
  • boolean
  • numeric
  • printableascii
  • path

and you can also use compare operator and regExp in tags

> 1 //greater than 1
>=1 //greater than or equal to 1
>1 <10 //greater than 1 and less than 10, space indicates the "and" of rules

(1, ) //range expression, same as >1
(1, 10) // >1 <10
(1,10]  // >1 <=10

/[0-9]/ //regex matching

/[0-9]+/ (1, 10) // the value should satisfy both the regex and range expression

netaddr //named validator, used to validate a network address
numeric  >10 ( ,100)// mix different expressions, 'and' is used to combine all expressions

See the Suppoted Vaildator for all valid "named validators"

Struct tags

tags has a key 'cfg' and its value consists of four parts: "name; default value or required; rule; descripion". All four parts are splited by ";".

For example:

Listen `cfg:"listen; :8804; netaddr; The listen address of server"`

It looks like this when being marshaled to toml

#type:        string
#rules:       netaddr
#description: The listen address of server
#default:     :8804
#listen=":8804"

You can see that we have rich information about the option. And the option is commented out too because it has a default value.

configo-build

Configo comes with a util tool called configo-build to build a configration file generator for you.

You can use the generator to generate your toml file or update it when you changed your source code(the configuration struct).

configo-build ./conf.Config
#build a conf generator, the format of arg is "package.struct" package can be
#absolute or relative(golang takes it as an absolute package if it is without
#the prefix "./" or "../").

#the built program has a name with format:<package>.<struct>.cfg, for example
#"conf.config.cfg"

Generating your configuration file with the built generator

conf.config.cfg > conf.toml #generating
conf.config.cfg -patch conf.toml #updating if conf.toml has already existed

configo's People

Contributors

alexisfasquel avatar arthurkiller avatar shafreeck avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

configo's Issues

Unmarshal hangs

Working with the library I found a bug: the call to Unmarshal just hangs forever.
The following code allows to reproduce the issue.

package main

import (
	"github.com/shafreeck/configo"
	"fmt"
)

type SimpleTest struct {
	Test string
}

type ComlexeTest struct {
	Test string
	Test1 []SimpleTest
	Test2 []SimpleTest
}

type Config struct {
	Test ComlexeTest
}

var toml = `
[test]
	test = "test"
	[[test.test1]]
		test = "test1"
	[[test.test2]]
		test = "test2"
`

func Test2() {
	c := &Config{}
	if err := configo.Unmarshal([]byte(toml), &c); err != nil {
		panic(err)
	}
	fmt.Println(c)
}

Export the applyDefault function

Export the applyDefault function as ApplyDefault.

It is useful to build an object with default configurations.

// now the default is an object initialized by empty values.
default := conf.ExampleConfig()
// fill the fields with default value
configo.ApplyDefault(&default)

field corresponding not defined, even it is defined

My config struct is like this:

type Config struct {
    Client struct {
        ServerAddress  string        `cfg:"server_address, https://server.example.com, url, Server address"`
        Identifier     string        `cfg:"identifier, required, ascii, Identifier"`
        UpdateInterval time.Duration `cfg:"update_interval, 60, int, Update interval in seconds"`
        LANInterface   string        `cfg:"lan_interface, auto, alphanumeric, Which LAN interface to use, will return the first LAN interface available"`
    } `cfg:"client"`
}

And my config is like below:

[client]
server_address="https://server.example.com"
identifier="id"
update_interval=60
lan_interface="auto"

I have a global variable config:

var config = &Config{}

And I have err := configo.Unmarshal(conf, &config) in main(), but I get this error when I run:

Error parsing config: line 5: field corresponding to `lan_interface' is not defined in `*struct { ServerAddress string "cfg:\"server_address, https://server.example.com, url, Server address\""; Identifier string "cfg:\"identifier, required, ascii, Identifier\""; UpdateInterval time.Duration "cfg:\"update_interval, 60, int, Update interval in seconds\""; LANInterface string "cfg:\"lan_interface, auto, alphanumeric, Which LAN interface to use, will return the first LAN interface available\"" }' 

But in fact lan_interface is defined. Any ideas?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.