This is version 1.x of kong-hcl. Version 2 of this package uses the HCL2 library but is otherwise largely a drop-in replacement (see the README for details).
Use it like so:
var cli struct {
Config kong.ConfigFlag `help:"Load configuration."`
}
parser, err := kong.New(&cli, kong.Configuration(konghcl.Loader, "/etc/myapp/config.hcl", "~/.myapp.hcl))
More complex structures can be loaded directly into flag values by implementing the
kong.MapperValue
interface, and calling konghcl.DecodeValue
.
The value can either be a HCL(/JSON) fragment, or a path to a HCL file that will be loaded. Both can be specified on the command-line or config file.
eg.
type NestedConfig struct {
Size int
Name string
}
type ComplexConfig struct {
Key bool
Nested map[string]NestedConfig
}
func (c *ComplexConfig) Decode(ctx *kong.DecodeContext) error {
return konghcl.DecodeValue(ctx, c)
}
// ...
type Config struct {
Complex ComplexConfig
}
Then the following .hcl
config fragment will be decoded into Complex
:
complex {
key = true
nested first {
size = 10
name = "first name"
}
nested second {
size = 12
name = "second name"
}
}
Configuration keys are mapped directly to flags.
Additionally, HCL block keys will be used as a hyphen-separated prefix when looking up flags.
The following Kong CLI:
type CLI struct {
Debug bool
DB struct {
DSN string
Trace bool
} `embed:"" prefix:"db-"`
}
Maps to the following flags:
--debug
--db-dsn=<string>
--db-trace
And can be configured via the following HCL configuration file...
debug = true
db {
dsn = "root@/database"
trace = true
}