diff --git a/config.go b/config.go index 4f54005..640dfbe 100644 --- a/config.go +++ b/config.go @@ -23,6 +23,7 @@ package config import ( "bufio" + "flag" "fmt" "os" "reflect" @@ -80,6 +81,23 @@ func (c *Builder) From(file string) *Builder { return c } +// FromFlags returns a new Builder, populated with the values from set flags. +// Flags must be parsed before calling this function. +func FromFlags() *Builder { + return newBuilder().FromFlags() +} + +// FromFlags merges new values from set flag into the current config state, returning the Builder. +// Flags must be parsed before calling this function. +func (c *Builder) FromFlags() *Builder { + m := make(map[string]string) + flag.Visit(func(f *flag.Flag) { + m[strings.ToLower(f.Name)] = f.Value.String() + }) + c.mergeConfig(m) + return c +} + // FromEnv returns a new Builder, populated with environment variables func FromEnv() *Builder { return newBuilder().FromEnv() diff --git a/example_test.go b/example_test.go index 915fcfe..8ae64f1 100644 --- a/example_test.go +++ b/example_test.go @@ -1,6 +1,7 @@ package config_test import ( + "flag" "fmt" "io/ioutil" "os" @@ -66,3 +67,27 @@ func Example_fromFileWithOverride() { // 5678 // true } + +func Example_flags() { + flag.String("databaseUrl", "", "") + flag.Int("port", 0, "") + // for slices, set the flag's type to the slices type + flag.String("subconfig__ipwhitelist", "", "") + + flag.Set("databaseUrl", "db://") + flag.Set("port", "5678") + flag.Set("subconfig__ipwhitelist", "0.0.0.0 1.1.1.1 2.2.2.2") + flag.Parse() + + var c MyConfig + config.FromFlags().To(&c) + + fmt.Println(c.DatabaseURL) + fmt.Println(c.Port) + fmt.Println(c.SubConfig.IPWhitelist, len(c.SubConfig.IPWhitelist)) + + // Output: + // db:// + // 5678 + // [0.0.0.0 1.1.1.1 2.2.2.2] 3 +}