From 2b32b143a00941e63918468c3dc2212c36dafc0d Mon Sep 17 00:00:00 2001 From: urso Date: Thu, 23 Jun 2016 13:03:34 +0200 Subject: [PATCH] Update urso/ucfg to elastic/go-ucfg v0.3.0 --- CHANGELOG.asciidoc | 4 + glide.yaml | 4 +- libbeat/common/config.go | 4 +- metricbeat/mb/mb_test.go | 8 +- .../ucfg => elastic/go-ucfg}/CHANGELOG.md | 27 +- .../{urso/ucfg => elastic/go-ucfg}/LICENSE | 0 vendor/github.com/elastic/go-ucfg/README.md | 8 + .../elastic/go-ucfg/cfgutil/cfgutil.go | 53 ++ .../{urso/ucfg => elastic/go-ucfg}/error.go | 38 +- .../github.com/elastic/go-ucfg/flag/file.go | 30 ++ .../github.com/elastic/go-ucfg/flag/flag.go | 125 +++++ .../github.com/elastic/go-ucfg/flag/util.go | 64 +++ .../github.com/elastic/go-ucfg/flag/value.go | 82 +++ .../{urso/ucfg => elastic/go-ucfg}/getset.go | 57 +- .../ucfg => elastic/go-ucfg}/json/json.go | 2 +- .../{urso/ucfg => elastic/go-ucfg}/merge.go | 70 ++- .../{urso/ucfg => elastic/go-ucfg}/opts.go | 33 +- .../{urso/ucfg => elastic/go-ucfg}/path.go | 41 +- .../{urso/ucfg => elastic/go-ucfg}/reify.go | 213 +++++--- .../message/arr_missing_nested_w_meta.golden | 0 .../message/arr_missing_nested_wo_meta.golden | 0 .../error/message/arr_missing_w_meta.golden | 0 .../error/message/arr_missing_wo_meta.golden | 0 .../message/arr_oob_nested_w_meta.golden | 0 .../message/arr_oob_nested_wo_meta.golden | 0 .../error/message/arr_oob_w_meta.golden | 0 .../error/message/arr_oob_wo_meta.golden | 0 .../message/array_size_nested_w_meta.golden | 0 .../message/array_size_nested_wo_meta.golden | 0 .../error/message/array_size_w_meta.golden | 0 .../error/message/array_size_wo_meta.golden | 0 .../message/conversion_nested_w_meta.golden | 0 .../message/conversion_nested_wo_meta.golden | 0 .../error/message/conversion_w_meta.golden | 0 .../error/message/conversion_wo_meta.golden | 0 .../message/duplicate_nested_w_meta.golden | 0 .../message/duplicate_nested_wo_meta.golden | 0 .../error/message/duplicate_w_meta.golden | 0 .../error/message/duplicate_wo_meta.golden | 0 .../expected_object_nested_w_meta.golden | 0 .../expected_object_nested_wo_meta.golden | 0 .../message/expected_object_w_meta.golden | 0 .../message/expected_object_wo_meta.golden | 0 .../error/message/inline_nested_w_meta.golden | 0 .../message/inline_nested_wo_meta.golden | 0 .../error/message/inline_w_meta.golden | 0 .../error/message/inline_wo_meta.golden | 0 .../message/invalid_duration_w_meta.golden | 0 .../message/invalid_duration_wo_meta.golden | 0 .../message/invalid_regexp_w_meta.golden | 0 .../message/invalid_regexp_wo_meta.golden | 0 .../invalid_type_merge_nested_w_meta.golden | 0 .../invalid_type_merge_nested_wo_meta.golden | 0 .../message/invalid_type_merge_w_meta.golden | 0 .../message/invalid_type_merge_wo_meta.golden | 0 .../message/invalid_type_top_level.golden | 0 .../invalid_type_unpack_nested_w_meta.golden | 0 .../invalid_type_unpack_nested_wo_meta.golden | 0 .../message/invalid_type_unpack_w_meta.golden | 0 .../invalid_type_unpack_wo_meta.golden | 0 .../message/missing_nested_w_meta.golden | 0 .../message/missing_nested_wo_meta.golden | 0 .../error/message/missing_w_meta.golden | 0 .../error/message/missing_wo_meta.golden | 0 .../error/message/nil_config_error.golden | 0 .../error/message/nil_value_error.golden | 0 .../error/message/parse_splice_w_meta.golden | 1 + .../error/message/pointer_required.golden | 0 .../error/message/squash_nested_w_meta.golden | 0 .../message/squash_nested_wo_meta.golden | 0 .../error/message/squash_w_meta.golden | 0 .../error/message/squash_wo_meta.golden | 0 ...to_type_not_supported_nested_w_meta.golden | 0 ...o_type_not_supported_nested_wo_meta.golden | 0 .../to_type_not_supported_w_meta.golden | 0 .../to_type_not_supported_wo_meta.golden | 0 ...nsupported_input_type_nested_w_meta.golden | 0 ...supported_input_type_nested_wo_meta.golden | 0 .../unsupported_input_type_w_meta.golden | 0 .../unsupported_input_type_wo_meta.golden | 0 .../message/validation_nested_w_meta.golden | 1 + .../message/validation_nested_wo_meta.golden | 1 + .../error/message/validation_w_meta.golden | 1 + .../error/message/validation_wo_meta.golden | 1 + vendor/github.com/elastic/go-ucfg/types.go | 492 ++++++++++++++++++ .../{urso/ucfg => elastic/go-ucfg}/ucfg.go | 2 +- .../{urso/ucfg => elastic/go-ucfg}/util.go | 0 .../ucfg => elastic/go-ucfg}/validator.go | 18 +- .../github.com/elastic/go-ucfg/variables.go | 452 ++++++++++++++++ .../ucfg => elastic/go-ucfg}/yaml/yaml.go | 2 +- vendor/github.com/urso/ucfg/README.md | 8 - .../message/validation_nested_w_meta.golden | 1 - .../message/validation_nested_wo_meta.golden | 1 - .../error/message/validation_w_meta.golden | 1 - .../error/message/validation_wo_meta.golden | 1 - vendor/github.com/urso/ucfg/types.go | 310 ----------- 96 files changed, 1675 insertions(+), 481 deletions(-) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/CHANGELOG.md (68%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/LICENSE (100%) create mode 100644 vendor/github.com/elastic/go-ucfg/README.md create mode 100644 vendor/github.com/elastic/go-ucfg/cfgutil/cfgutil.go rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/error.go (87%) create mode 100644 vendor/github.com/elastic/go-ucfg/flag/file.go create mode 100644 vendor/github.com/elastic/go-ucfg/flag/flag.go create mode 100644 vendor/github.com/elastic/go-ucfg/flag/util.go create mode 100644 vendor/github.com/elastic/go-ucfg/flag/value.go rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/getset.go (68%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/json/json.go (94%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/merge.go (74%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/opts.go (52%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/path.go (74%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/reify.go (66%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_missing_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_missing_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_missing_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_missing_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_oob_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_oob_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_oob_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/arr_oob_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/array_size_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/array_size_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/array_size_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/array_size_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/conversion_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/conversion_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/conversion_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/conversion_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/duplicate_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/duplicate_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/duplicate_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/duplicate_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/expected_object_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/expected_object_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/expected_object_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/expected_object_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/inline_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/inline_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/inline_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/inline_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_duration_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_duration_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_regexp_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_regexp_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_merge_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_merge_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_merge_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_merge_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_top_level.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_unpack_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_unpack_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_unpack_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/invalid_type_unpack_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/missing_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/missing_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/missing_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/missing_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/nil_config_error.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/nil_value_error.golden (100%) create mode 100644 vendor/github.com/elastic/go-ucfg/testdata/error/message/parse_splice_w_meta.golden rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/pointer_required.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/squash_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/squash_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/squash_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/squash_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/to_type_not_supported_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/to_type_not_supported_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/to_type_not_supported_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/to_type_not_supported_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/unsupported_input_type_nested_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/unsupported_input_type_nested_wo_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/unsupported_input_type_w_meta.golden (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/testdata/error/message/unsupported_input_type_wo_meta.golden (100%) create mode 100644 vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_w_meta.golden create mode 100644 vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_wo_meta.golden create mode 100644 vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_w_meta.golden create mode 100644 vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_wo_meta.golden create mode 100644 vendor/github.com/elastic/go-ucfg/types.go rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/ucfg.go (98%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/util.go (100%) rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/validator.go (94%) create mode 100644 vendor/github.com/elastic/go-ucfg/variables.go rename vendor/github.com/{urso/ucfg => elastic/go-ucfg}/yaml/yaml.go (94%) delete mode 100644 vendor/github.com/urso/ucfg/README.md delete mode 100644 vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_w_meta.golden delete mode 100644 vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_wo_meta.golden delete mode 100644 vendor/github.com/urso/ucfg/testdata/error/message/validation_w_meta.golden delete mode 100644 vendor/github.com/urso/ucfg/testdata/error/message/validation_wo_meta.golden delete mode 100644 vendor/github.com/urso/ucfg/types.go diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index b1669de6b99..9e311ee3e82 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -33,6 +33,8 @@ https://github.com/elastic/beats/compare/v5.0.0-alpha3...master[Check the HEAD d - Reset backoff factor on partial ACK. {issue}1803[1803] - Fix beats load balancer deadlock if max_retries: -1 or publish_async is enabled in filebeat. {issue}1829[1829] - Fix logstash output with pipelining mode enabled not reconnecting. {issue}1876[1876] +- Empty configuration sections become merge-able with variables containing full path. {pull}1900[1900] +- Fix error message about required fields missing not printing the missing field name. {pull}1900[1900] *Metricbeat* - Fix the CPU values returned for each core. {issue}1863[1863] @@ -51,6 +53,8 @@ https://github.com/elastic/beats/compare/v5.0.0-alpha3...master[Check the HEAD d *Affecting all Beats* +- Improve error message if compiling regular expression from config files fails. {pull}1900[1900] + *Metricbeat* diff --git a/glide.yaml b/glide.yaml index e45e0d41606..5bca8293f46 100644 --- a/glide.yaml +++ b/glide.yaml @@ -60,8 +60,8 @@ import: - breaker - package: github.com/dustin/go-humanize version: 499693e27ee0d14ffab67c31ad065fdb3d34ea75 -- package: github.com/urso/ucfg - version: v0.2.1 +- package: github.com/elastic/go-ucfg + version: v0.3.0 - package: github.com/armon/go-socks5 version: 3a873e99f5400ad7706e464e905ffcc94b3ff247 - package: github.com/pkg/errors diff --git a/libbeat/common/config.go b/libbeat/common/config.go index 4939e6b6e51..54073b8f358 100644 --- a/libbeat/common/config.go +++ b/libbeat/common/config.go @@ -1,8 +1,8 @@ package common import ( - "github.com/urso/ucfg" - "github.com/urso/ucfg/yaml" + "github.com/elastic/go-ucfg" + "github.com/elastic/go-ucfg/yaml" ) type Config ucfg.Config diff --git a/metricbeat/mb/mb_test.go b/metricbeat/mb/mb_test.go index e6c37b87dfe..25270c577df 100644 --- a/metricbeat/mb/mb_test.go +++ b/metricbeat/mb/mb_test.go @@ -27,13 +27,13 @@ func TestModuleConfig(t *testing.T) { }{ { in: map[string]interface{}{}, - err: "missing required field accessing config", + err: "missing required field accessing 'module'", }, { in: map[string]interface{}{ "module": "example", }, - err: "missing required field accessing config", + err: "missing required field accessing 'metricsets'", }, { in: map[string]interface{}{ @@ -171,8 +171,8 @@ func TestNewBaseModuleFromModuleConfigStruct(t *testing.T) { assert.Equal(t, moduleName, baseModule.Name()) assert.Equal(t, moduleName, baseModule.Config().Module) assert.Equal(t, true, baseModule.Config().Enabled) - //assert.Equal(t, time.Second, baseModule.Config().Period) // TODO (urso/ucfg#25) - //assert.Equal(t, time.Second, baseModule.Config().Timeout) // TODO (urso/ucfg#25) + assert.Equal(t, time.Second, baseModule.Config().Period) + assert.Equal(t, time.Second, baseModule.Config().Timeout) assert.Empty(t, baseModule.Config().Hosts) } diff --git a/vendor/github.com/urso/ucfg/CHANGELOG.md b/vendor/github.com/elastic/go-ucfg/CHANGELOG.md similarity index 68% rename from vendor/github.com/urso/ucfg/CHANGELOG.md rename to vendor/github.com/elastic/go-ucfg/CHANGELOG.md index c2c45f8bd64..74fe0933324 100644 --- a/vendor/github.com/urso/ucfg/CHANGELOG.md +++ b/vendor/github.com/elastic/go-ucfg/CHANGELOG.md @@ -7,7 +7,6 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added ### Changed -- Report error message from regexp.Compile if compilation fails #21 ### Deprecated @@ -15,6 +14,21 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed +## [0.3.0] + +### Added +- Added CLI flag support. #15 +- Added variable expansion support. #14 + +### Changed +- Report error message from regexp.Compile if compilation fails #21 + +### Fixed +- Nil values become merge-able with concrete types. #26 +- Fix merging types `time.Duration` and `*regexp.Regexp`. #25 +- Fix Validate-method not being run for structs. #32 +- Fix field validation errors on structs fields does not contain missing or failed configuration variable. #31 + ## [0.2.1] ### Changed @@ -59,8 +73,9 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Introduced CHANGELOG.md for documenting changes to ucfg. -[Unreleased]: https://github.com/urso/ucfg/compare/v0.2.1...HEAD -[0.2.1]: https://github.com/urso/ucfg/compare/v0.2.0...v0.2.1 -[0.2.0]: https://github.com/urso/ucfg/compare/v0.1.1...v0.2.0 -[0.1.1]: https://github.com/urso/ucfg/compare/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/urso/ucfg/compare/v0.0.0...v0.1.0 +[Unreleased]: https://github.com/elastic/go-ucfg/compare/v0.3.0...HEAD +[0.3.0]: https://github.com/elastic/go-ucfg/compare/v0.2.1...v0.3.0 +[0.2.1]: https://github.com/elastic/go-ucfg/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/elastic/go-ucfg/compare/v0.1.1...v0.2.0 +[0.1.1]: https://github.com/elastic/go-ucfg/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/elastic/go-ucfg/compare/v0.0.0...v0.1.0 diff --git a/vendor/github.com/urso/ucfg/LICENSE b/vendor/github.com/elastic/go-ucfg/LICENSE similarity index 100% rename from vendor/github.com/urso/ucfg/LICENSE rename to vendor/github.com/elastic/go-ucfg/LICENSE diff --git a/vendor/github.com/elastic/go-ucfg/README.md b/vendor/github.com/elastic/go-ucfg/README.md new file mode 100644 index 00000000000..bacae6a2bce --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/README.md @@ -0,0 +1,8 @@ +# ucfg + +[![Build +Status](https://travis-ci.org/elastic/go-ucfg.svg?branch=master)](https://travis-ci.org/elastic/go-ucfg) + +[![Go Report +Card](https://goreportcard.com/badge/github.com/elastic/go-ucfg)](https://goreportcard.com/report/github.com/elastic/go-ucfg) + diff --git a/vendor/github.com/elastic/go-ucfg/cfgutil/cfgutil.go b/vendor/github.com/elastic/go-ucfg/cfgutil/cfgutil.go new file mode 100644 index 00000000000..293151290c3 --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/cfgutil/cfgutil.go @@ -0,0 +1,53 @@ +package cfgutil + +import "github.com/elastic/go-ucfg" + +// Collector collects and merges multiple generated *ucfg.Config, remembering +// errors, for postponing error checking after having merged all loaded configurations. +type Collector struct { + config *ucfg.Config + err error + opts []ucfg.Option +} + +func NewCollector(cfg *ucfg.Config, opts ...ucfg.Option) *Collector { + if cfg == nil { + cfg = ucfg.New() + } + return &Collector{config: cfg, err: nil} +} + +func (c *Collector) GetOptions() []ucfg.Option { + return c.opts +} + +func (c *Collector) Get() (*ucfg.Config, error) { + return c.config, c.err +} + +func (c *Collector) Config() *ucfg.Config { + return c.config +} + +func (c *Collector) Error() error { + return c.err +} + +func (c *Collector) Add(cfg *ucfg.Config, err error) error { + if c.err != nil { + return c.err + } + + if err != nil { + c.err = err + return err + } + + if cfg != nil { + err = c.config.Merge(cfg, c.opts...) + if err != nil { + c.err = err + } + } + return err +} diff --git a/vendor/github.com/urso/ucfg/error.go b/vendor/github.com/elastic/go-ucfg/error.go similarity index 87% rename from vendor/github.com/urso/ucfg/error.go rename to vendor/github.com/elastic/go-ucfg/error.go index 782157fafb4..de8ef410357 100644 --- a/vendor/github.com/urso/ucfg/error.go +++ b/vendor/github.com/elastic/go-ucfg/error.go @@ -179,10 +179,11 @@ func raiseMissingArr(ctx context, meta *Meta, idx int) Error { return raisePathErr(ErrMissing, meta, message, ctx.path(".")) } -func raiseIndexOutOfBounds(value value, idx int) Error { +func raiseIndexOutOfBounds(opts *options, value value, idx int) Error { reason := ErrIndexOutOfRange ctx := value.Context() - message := fmt.Sprintf("index '%v' out of range (length=%v)", idx, value.Len()) + len, _ := value.Len(opts) + message := fmt.Sprintf("index '%v' out of range (length=%v)", idx, len) return raisePathErr(reason, value.meta(), message, ctx.path(".")) } @@ -208,7 +209,7 @@ func raiseKeyInvalidTypeMerge(cfg *Config, t reflect.Type) Error { return raiseCritical(reason, messagePath(reason, cfg.metadata, message, ctx.path("."))) } -func raiseSquashNeedsObject(cfg *Config, opts options, f string, t reflect.Type) Error { +func raiseSquashNeedsObject(cfg *Config, opts *options, f string, t reflect.Type) Error { reason := ErrTypeMismatch message := fmt.Sprintf("require map or struct when squash merging '%v' (%v)", f, t) @@ -240,9 +241,11 @@ func raisePointerRequired(v reflect.Value) Error { return raiseCritical(ErrPointerRequired, "") } -func raiseToTypeNotSupported(v value, t reflect.Type) Error { +func raiseToTypeNotSupported(opts *options, v value, goT reflect.Type) Error { reason := ErrTypeMismatch - message := fmt.Sprintf("value of type '%v' not convertible into unsupported go type '%v'", v.typeName(), t) + t, _ := v.typ(opts) + message := fmt.Sprintf("value of type '%v' not convertible into unsupported go type '%v'", + t.name, goT) ctx := v.Context() return raiseCritical(reason, messagePath(reason, v.meta(), message, ctx.path("."))) @@ -256,18 +259,20 @@ func raiseArraySize(ctx context, meta *Meta, n int, to int) Error { return raisePathErr(reason, meta, message, ctx.path(".")) } -func raiseConversion(v value, err error, to string) Error { +func raiseConversion(opts *options, v value, err error, to string) Error { ctx := v.Context() path := ctx.path(".") - message := fmt.Sprintf("can not convert '%v' into '%v'", v.typeName(), to) + t, _ := v.typ(opts) + message := fmt.Sprintf("can not convert '%v' into '%v'", t.name, to) return raisePathErr(err, v.meta(), message, path) } -func raiseExpectedObject(v value) Error { +func raiseExpectedObject(opts *options, v value) Error { ctx := v.Context() path := ctx.path(".") + t, _ := v.typ(opts) message := fmt.Sprintf("required 'object', but found '%v' in field '%v'", - v.typeName(), path) + t.name, path) return raiseErr(ErrExpectedObject, messageMeta(message, v.meta())) } @@ -278,8 +283,14 @@ func raiseInvalidDuration(v value, err error) Error { return raisePathErr(err, v.meta(), "", path) } -func raiseValidation(ctx context, meta *Meta, err error) Error { - return raiseErr(err, messagePath(err, meta, err.Error(), ctx.path("."))) +func raiseValidation(ctx context, meta *Meta, field string, err error) Error { + path := "" + if field == "" { + path = ctx.path(".") + } else { + path = ctx.pathOf(field, ".") + } + return raiseErr(err, messagePath(err, meta, err.Error(), path)) } func raiseInvalidRegexp(v value, err error) Error { @@ -288,3 +299,8 @@ func raiseInvalidRegexp(v value, err error) Error { message := fmt.Sprintf("Failed to compile regular expression with '%v'", err) return raisePathErr(err, v.meta(), message, path) } + +func raiseParseSplice(ctx context, meta *Meta, err error) Error { + message := fmt.Sprintf("%v parsing splice", err) + return raisePathErr(err, meta, message, ctx.path(".")) +} diff --git a/vendor/github.com/elastic/go-ucfg/flag/file.go b/vendor/github.com/elastic/go-ucfg/flag/file.go new file mode 100644 index 00000000000..10a5e568d10 --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/flag/file.go @@ -0,0 +1,30 @@ +package flag + +import ( + "fmt" + "path/filepath" + + "github.com/elastic/go-ucfg" +) + +type FileLoader func(name string, opts ...ucfg.Option) (*ucfg.Config, error) + +func NewFlagFiles( + cfg *ucfg.Config, + extensions map[string]FileLoader, + opts ...ucfg.Option, +) *FlagValue { + return newFlagValue(cfg, opts, func(path string) (*ucfg.Config, error, error) { + ext := filepath.Ext(path) + loader := extensions[ext] + if loader == nil { + loader = extensions[""] + } + if loader == nil { + // TODO: better error message? + return nil, fmt.Errorf("no loader for file '%v' found", path), nil + } + cfg, err := loader(path, opts...) + return cfg, err, nil + }) +} diff --git a/vendor/github.com/elastic/go-ucfg/flag/flag.go b/vendor/github.com/elastic/go-ucfg/flag/flag.go new file mode 100644 index 00000000000..b768a50208c --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/flag/flag.go @@ -0,0 +1,125 @@ +package flag + +import ( + goflag "flag" + + "github.com/elastic/go-ucfg" + "github.com/elastic/go-ucfg/json" + "github.com/elastic/go-ucfg/yaml" +) + +func ConfigVar( + set *goflag.FlagSet, + def *ucfg.Config, + name string, + usage string, + opts ...ucfg.Option, +) *ucfg.Config { + v := NewFlagKeyValue(def, true, opts...) + registerFlag(set, v, name, usage) + return v.Config() +} + +func Config( + set *goflag.FlagSet, + name string, + usage string, + opts ...ucfg.Option, +) *ucfg.Config { + return ConfigVar(set, nil, name, usage, opts...) +} + +func ConfigFilesVar( + set *goflag.FlagSet, + def *ucfg.Config, + name string, + usage string, + extensions map[string]FileLoader, + opts ...ucfg.Option, +) *FlagValue { + v := NewFlagFiles(def, extensions, opts...) + registerFlag(set, v, name, usage) + return v +} + +func ConfigFiles( + set *goflag.FlagSet, + name string, + usage string, + extensions map[string]FileLoader, + opts ...ucfg.Option, +) *FlagValue { + return ConfigFilesVar(set, nil, name, usage, extensions, opts...) +} + +func ConfigYAMLFilesVar( + set *goflag.FlagSet, + def *ucfg.Config, + name string, + usage string, + opts ...ucfg.Option, +) *FlagValue { + exts := map[string]FileLoader{"": yaml.NewConfigWithFile} + return ConfigFilesVar(set, def, name, usage, exts, opts...) +} + +func ConfigYAMLFiles( + set *goflag.FlagSet, + name string, + usage string, + opts ...ucfg.Option, +) *FlagValue { + return ConfigYAMLFilesVar(set, nil, name, usage, opts...) +} + +func ConfigJSONFilesVar( + set *goflag.FlagSet, + def *ucfg.Config, + name string, + usage string, + opts ...ucfg.Option, +) *FlagValue { + exts := map[string]FileLoader{"": json.NewConfigWithFile} + return ConfigFilesVar(set, def, name, usage, exts, opts...) +} + +func ConfigJSONFiles( + set *goflag.FlagSet, + name string, + usage string, + opts ...ucfg.Option, +) *FlagValue { + return ConfigJSONFilesVar(set, nil, name, usage, opts...) +} + +func ConfigFilesExtsVar( + set *goflag.FlagSet, + def *ucfg.Config, + name string, + usage string, + opts ...ucfg.Option, +) *FlagValue { + exts := map[string]FileLoader{ + ".yaml": yaml.NewConfigWithFile, + ".yml": yaml.NewConfigWithFile, + ".json": json.NewConfigWithFile, + } + return ConfigFilesVar(set, def, name, usage, exts, opts...) +} + +func ConfigFilesExts( + set *goflag.FlagSet, + name string, + usage string, + opts ...ucfg.Option, +) *FlagValue { + return ConfigFilesExtsVar(set, nil, name, usage, opts...) +} + +func registerFlag(set *goflag.FlagSet, v goflag.Value, name, usage string) { + if set != nil { + set.Var(v, name, usage) + } else { + goflag.Var(v, name, usage) + } +} diff --git a/vendor/github.com/elastic/go-ucfg/flag/util.go b/vendor/github.com/elastic/go-ucfg/flag/util.go new file mode 100644 index 00000000000..e752fb5821b --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/flag/util.go @@ -0,0 +1,64 @@ +package flag + +import ( + "encoding/json" + + "github.com/elastic/go-ucfg" + "github.com/elastic/go-ucfg/cfgutil" +) + +type FlagValue struct { + collector *cfgutil.Collector + loader func(arg string) (*ucfg.Config, error, error) +} + +func newFlagValue( + cfg *ucfg.Config, + opts []ucfg.Option, + loader func(string) (*ucfg.Config, error, error), +) *FlagValue { + return &FlagValue{ + collector: cfgutil.NewCollector(cfg, opts...), + loader: loader, + } +} + +func (v *FlagValue) Config() *ucfg.Config { + return v.collector.Config() +} + +func (v *FlagValue) Error() error { + return v.collector.Error() +} + +func (v *FlagValue) String() string { + return toString(v.Config(), v.collector.GetOptions(), v.onError) +} + +func (v *FlagValue) Get() interface{} { + return v.Config() +} + +func (v *FlagValue) Set(arg string) error { + cfg, internalErr, reportErr := v.loader(arg) + v.collector.Add(cfg, internalErr) + return reportErr +} + +func (v *FlagValue) onError(err error) error { + return v.collector.Add(nil, err) +} + +func toString(cfg *ucfg.Config, opts []ucfg.Option, onError func(error) error) string { + var tmp map[string]interface{} + if err := cfg.Unpack(&tmp, opts...); err != nil { + return onError(err).Error() + } + + js, err := json.Marshal(tmp) + if err != nil { + return onError(err).Error() + } + + return string(js) +} diff --git a/vendor/github.com/elastic/go-ucfg/flag/value.go b/vendor/github.com/elastic/go-ucfg/flag/value.go new file mode 100644 index 00000000000..ddb4bc3516f --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/flag/value.go @@ -0,0 +1,82 @@ +package flag + +import ( + "fmt" + "strconv" + "strings" + + "github.com/elastic/go-ucfg" +) + +// NewFlagKeyValue implements the flag.Value interface for +// capturing ucfg.Config settings from command line arguments. +// Configuration options follow the argument name and must be in the form of +// "key=value". Using 'D' as command line flag for example, options on command line +// must be given as: +// +// -D key1=value -D key=value +// +// Note: the space between command line option and key is required by the flag +// package to parse command line flags correctly. +// +// Note: it's valid to use a key multiple times. If keys are used multiple +// times, values get overwritten. The last known value for some key will be stored +// in the generated configuration. +// +// The type of value must be any of bool, uint, int, float, or string. Any kind +// of array or object syntax is not supported. +// +// If autoBool is enabled (default if Config or ConfigVar is used), keys without +// value are converted to bool variable with value being true. +func NewFlagKeyValue(cfg *ucfg.Config, autoBool bool, opts ...ucfg.Option) *FlagValue { + return newFlagValue(cfg, opts, func(arg string) (*ucfg.Config, error, error) { + var key string + var val interface{} + + args := strings.SplitN(arg, "=", 2) + if len(args) < 2 { + if !autoBool || len(args) == 0 { + err := fmt.Errorf("argument '%v' is empty ", arg) + return nil, err, err + } + + key = arg + val = true + } else { + key = args[0] + val = parseCLIValue(args[1]) + } + + tmp := map[string]interface{}{key: val} + cfg, err := ucfg.NewFrom(tmp, opts...) + return cfg, err, err + }) +} + +func parseCLIValue(value string) interface{} { + if b, ok := parseBoolValue(value); ok { + return b + } + + if n, err := strconv.ParseUint(value, 0, 64); err == nil { + return n + } + if n, err := strconv.ParseInt(value, 0, 64); err == nil { + return n + } + if n, err := strconv.ParseFloat(value, 64); err == nil { + return n + } + + return value +} + +func parseBoolValue(str string) (value bool, ok bool) { + switch str { + case "1", "t", "T", "true", "TRUE", "True", "on", "ON": + return true, true + case "0", "f", "F", "false", "FALSE", "False", "off", "OFF": + return false, true + } + return false, false +} diff --git a/vendor/github.com/urso/ucfg/getset.go b/vendor/github.com/elastic/go-ucfg/getset.go similarity index 68% rename from vendor/github.com/urso/ucfg/getset.go rename to vendor/github.com/elastic/go-ucfg/getset.go index e8673b5027a..ce558197bef 100644 --- a/vendor/github.com/urso/ucfg/getset.go +++ b/vendor/github.com/elastic/go-ucfg/getset.go @@ -4,74 +4,80 @@ package ucfg // Low level getters and setters (do we actually need this?) // ****************************************************************************** -func convertErr(v value, err error, to string) Error { +func convertErr(opts *options, v value, err error, to string) Error { if err == nil { return nil } - return raiseConversion(v, err, to) + return raiseConversion(opts, v, err, to) } // number of elements for this field. If config value is a list, returns number // of elements in list -func (c *Config) CountField(name string) (int, error) { +func (c *Config) CountField(name string, opts ...Option) (int, error) { if v, ok := c.fields.fields[name]; ok { - return v.Len(), nil + return v.Len(makeOptions(opts)) } return -1, raiseMissing(c, name) } func (c *Config) Bool(name string, idx int, opts ...Option) (bool, error) { - v, err := c.getField(name, idx, opts) + O := makeOptions(opts) + v, err := c.getField(name, idx, O) if err != nil { return false, err } - b, fail := v.toBool() - return b, convertErr(v, fail, "bool") + b, fail := v.toBool(O) + return b, convertErr(O, v, fail, "bool") } func (c *Config) String(name string, idx int, opts ...Option) (string, error) { - v, err := c.getField(name, idx, opts) + O := makeOptions(opts) + v, err := c.getField(name, idx, O) if err != nil { return "", err } - s, fail := v.toString() - return s, convertErr(v, fail, "string") + s, fail := v.toString(O) + return s, convertErr(O, v, fail, "string") } func (c *Config) Int(name string, idx int, opts ...Option) (int64, error) { - v, err := c.getField(name, idx, opts) + O := makeOptions(opts) + v, err := c.getField(name, idx, O) if err != nil { return 0, err } - i, fail := v.toInt() - return i, convertErr(v, fail, "int") + i, fail := v.toInt(O) + return i, convertErr(O, v, fail, "int") } func (c *Config) Uint(name string, idx int, opts ...Option) (uint64, error) { - v, err := c.getField(name, idx, opts) + O := makeOptions(opts) + v, err := c.getField(name, idx, O) if err != nil { return 0, err } - u, fail := v.toUint() - return u, convertErr(v, fail, "uint") + u, fail := v.toUint(O) + return u, convertErr(O, v, fail, "uint") } func (c *Config) Float(name string, idx int, opts ...Option) (float64, error) { - v, err := c.getField(name, idx, opts) + O := makeOptions(opts) + v, err := c.getField(name, idx, O) if err != nil { return 0, err } - f, fail := v.toFloat() - return f, convertErr(v, fail, "float") + f, fail := v.toFloat(O) + return f, convertErr(O, v, fail, "float") } func (c *Config) Child(name string, idx int, opts ...Option) (*Config, error) { - v, err := c.getField(name, idx, opts) + O := makeOptions(opts) + v, err := c.getField(name, idx, O) if err != nil { return nil, err } - c, fail := v.toConfig() - return c, convertErr(v, fail, "object") + c, fail := v.toConfig(O) + return c, convertErr(O, v, fail, "object") } func (c *Config) SetBool(name string, idx int, value bool, opts ...Option) error { @@ -98,10 +104,9 @@ func (c *Config) SetChild(name string, idx int, value *Config, opts ...Option) e return c.setField(name, idx, cfgSub{c: value}, opts) } -func (c *Config) getField(name string, idx int, options []Option) (value, Error) { - opts := makeOptions(options) +func (c *Config) getField(name string, idx int, opts *options) (value, Error) { p := parsePathIdx(name, opts.pathSep, idx) - v, err := p.GetValue(c) + v, err := p.GetValue(c, opts) if err != nil { return v, err } @@ -116,7 +121,7 @@ func (c *Config) setField(name string, idx int, v value, options []Option) Error opts := makeOptions(options) p := parsePathIdx(name, opts.pathSep, idx) - err := p.SetValue(c, v) + err := p.SetValue(c, opts, v) if err != nil { return err } diff --git a/vendor/github.com/urso/ucfg/json/json.go b/vendor/github.com/elastic/go-ucfg/json/json.go similarity index 94% rename from vendor/github.com/urso/ucfg/json/json.go rename to vendor/github.com/elastic/go-ucfg/json/json.go index 18b75503ef3..96de03ab03e 100644 --- a/vendor/github.com/urso/ucfg/json/json.go +++ b/vendor/github.com/elastic/go-ucfg/json/json.go @@ -4,7 +4,7 @@ import ( "encoding/json" "io/ioutil" - "github.com/urso/ucfg" + "github.com/elastic/go-ucfg" ) func NewConfig(in []byte, opts ...ucfg.Option) (*ucfg.Config, error) { diff --git a/vendor/github.com/urso/ucfg/merge.go b/vendor/github.com/elastic/go-ucfg/merge.go similarity index 74% rename from vendor/github.com/urso/ucfg/merge.go rename to vendor/github.com/elastic/go-ucfg/merge.go index dea2cdfedc1..336f7c72b67 100644 --- a/vendor/github.com/urso/ucfg/merge.go +++ b/vendor/github.com/elastic/go-ucfg/merge.go @@ -3,6 +3,8 @@ package ucfg import ( "fmt" "reflect" + "regexp" + "time" ) func (c *Config) Merge(from interface{}, options ...Option) error { @@ -11,10 +13,10 @@ func (c *Config) Merge(from interface{}, options ...Option) error { if err != nil { return err } - return mergeConfig(c, other) + return mergeConfig(opts, c, other) } -func mergeConfig(to, from *Config) Error { +func mergeConfig(opts *options, to, from *Config) Error { for k, v := range from.fields.fields { ctx := context{ parent: cfgSub{to}, @@ -27,19 +29,19 @@ func mergeConfig(to, from *Config) Error { continue } - subOld, err := old.toConfig() + subOld, err := old.toConfig(opts) if err != nil { to.fields.fields[k] = v.cpy(ctx) continue } - subFrom, err := v.toConfig() + subFrom, err := v.toConfig(opts) if err != nil { to.fields.fields[k] = v.cpy(ctx) continue } - if err := mergeConfig(subOld, subFrom); err != nil { + if err := mergeConfig(opts, subOld, subFrom); err != nil { return err } } @@ -48,7 +50,7 @@ func mergeConfig(to, from *Config) Error { // convert from into normalized *Config checking for errors // before merging generated(normalized) config with current config -func normalize(opts options, from interface{}) (*Config, Error) { +func normalize(opts *options, from interface{}) (*Config, Error) { vFrom := chaseValue(reflect.ValueOf(from)) switch vFrom.Type() { @@ -75,7 +77,7 @@ func normalize(opts options, from interface{}) (*Config, Error) { return nil, raiseInvalidTopLevelType(from) } -func normalizeMap(opts options, from reflect.Value) (*Config, Error) { +func normalizeMap(opts *options, from reflect.Value) (*Config, Error) { cfg := New() cfg.metadata = opts.meta if err := normalizeMapInto(cfg, opts, from); err != nil { @@ -84,7 +86,7 @@ func normalizeMap(opts options, from reflect.Value) (*Config, Error) { return cfg, nil } -func normalizeMapInto(cfg *Config, opts options, from reflect.Value) Error { +func normalizeMapInto(cfg *Config, opts *options, from reflect.Value) Error { k := from.Type().Key().Kind() if k != reflect.String && k != reflect.Interface { return raiseKeyInvalidTypeMerge(cfg, from.Type()) @@ -104,7 +106,7 @@ func normalizeMapInto(cfg *Config, opts options, from reflect.Value) Error { return nil } -func normalizeStruct(opts options, from reflect.Value) (*Config, Error) { +func normalizeStruct(opts *options, from reflect.Value) (*Config, Error) { cfg := New() cfg.metadata = opts.meta if err := normalizeStructInto(cfg, opts, from); err != nil { @@ -113,7 +115,7 @@ func normalizeStruct(opts options, from reflect.Value) (*Config, Error) { return cfg, nil } -func normalizeStructInto(cfg *Config, opts options, from reflect.Value) Error { +func normalizeStructInto(cfg *Config, opts *options, from reflect.Value) Error { v := chaseValue(from) numField := v.NumField() @@ -146,7 +148,7 @@ func normalizeStructInto(cfg *Config, opts options, from reflect.Value) Error { func normalizeSetField( cfg *Config, - opts options, + opts *options, tagOpts tagOptions, name string, v reflect.Value, @@ -157,7 +159,7 @@ func normalizeSetField( } p := parsePath(name, opts.pathSep) - old, err := p.GetValue(cfg) + old, err := p.GetValue(cfg, opts) if err != nil { if err.Reason() != ErrMissing { return err @@ -165,13 +167,16 @@ func normalizeSetField( old = nil } if old != nil { + if _, isNil := val.(*cfgNil); val == nil || isNil { + return nil + } return raiseDuplicateKey(cfg, name) } - return p.SetValue(cfg, val) + return p.SetValue(cfg, opts, val) } -func normalizeStructValue(opts options, ctx context, from reflect.Value) (value, Error) { +func normalizeStructValue(opts *options, ctx context, from reflect.Value) (value, Error) { sub, err := normalizeStruct(opts, from) if err != nil { return nil, err @@ -181,7 +186,7 @@ func normalizeStructValue(opts options, ctx context, from reflect.Value) (value, return v, nil } -func normalizeMapValue(opts options, ctx context, from reflect.Value) (value, Error) { +func normalizeMapValue(opts *options, ctx context, from reflect.Value) (value, Error) { sub, err := normalizeMap(opts, from) if err != nil { return nil, err @@ -192,7 +197,7 @@ func normalizeMapValue(opts options, ctx context, from reflect.Value) (value, Er } func normalizeArray( - opts options, + opts *options, tagOpts tagOptions, ctx context, v reflect.Value, @@ -223,13 +228,22 @@ func normalizeArray( } func normalizeValue( - opts options, + opts *options, tagOpts tagOptions, ctx context, v reflect.Value, ) (value, Error) { v = chaseValue(v) + switch v.Type() { + case tDuration: + d := v.Interface().(time.Duration) + return newString(ctx, opts.meta, d.String()), nil + case tRegexp: + r := v.Addr().Interface().(*regexp.Regexp) + return newString(ctx, opts.meta, r.String()), nil + } + // handle primitives switch v.Kind() { case reflect.Bool: @@ -246,7 +260,7 @@ func normalizeValue( f := v.Float() return newFloat(ctx, opts.meta, f), nil case reflect.String: - return newString(ctx, opts.meta, v.String()), nil + return normalizeString(ctx, opts, v.String()) case reflect.Array, reflect.Slice: return normalizeArray(opts, tagOpts, ctx, v) case reflect.Map: @@ -269,3 +283,23 @@ func normalizeValue( return nil, raiseUnsupportedInputType(ctx, opts.meta, v) } } + +func normalizeString(ctx context, opts *options, str string) (value, Error) { + if !opts.varexp { + return newString(ctx, opts.meta, str), nil + } + + varexp, err := parseSplice(str, opts.pathSep) + if err != nil { + return nil, raiseParseSplice(ctx, opts.meta, err) + } + + switch p := varexp.(type) { + case constExp: + return newString(ctx, opts.meta, str), nil + case *reference: + return newRef(ctx, opts.meta, p), nil + } + + return newSplice(ctx, opts.meta, varexp), nil +} diff --git a/vendor/github.com/urso/ucfg/opts.go b/vendor/github.com/elastic/go-ucfg/opts.go similarity index 52% rename from vendor/github.com/urso/ucfg/opts.go rename to vendor/github.com/elastic/go-ucfg/opts.go index c787e15c065..514a480f599 100644 --- a/vendor/github.com/urso/ucfg/opts.go +++ b/vendor/github.com/elastic/go-ucfg/opts.go @@ -1,5 +1,7 @@ package ucfg +import "os" + type Option func(*options) type options struct { @@ -7,6 +9,9 @@ type options struct { validatorTag string pathSep string meta *Meta + env []*Config + resolvers []func(name string) (string, error) + varexp bool } func StructTag(tag string) Option { @@ -33,7 +38,31 @@ func MetaData(meta Meta) Option { } } -func makeOptions(opts []Option) options { +func Env(e *Config) Option { + return func(o *options) { + o.env = append(o.env, e) + } +} + +func Resolve(fn func(name string) (string, error)) Option { + return func(o *options) { + o.resolvers = append(o.resolvers, fn) + } +} + +var ResolveEnv = Resolve(func(name string) (string, error) { + value := os.Getenv(name) + if value == "" { + return "", ErrMissing + } + return value, nil +}) + +var VarExp Option = func(o *options) { + o.varexp = true +} + +func makeOptions(opts []Option) *options { o := options{ tag: "config", validatorTag: "validate", @@ -42,5 +71,5 @@ func makeOptions(opts []Option) options { for _, opt := range opts { opt(&o) } - return o + return &o } diff --git a/vendor/github.com/urso/ucfg/path.go b/vendor/github.com/elastic/go-ucfg/path.go similarity index 74% rename from vendor/github.com/urso/ucfg/path.go rename to vendor/github.com/elastic/go-ucfg/path.go index 5bdfeac792b..bf01eacc116 100644 --- a/vendor/github.com/urso/ucfg/path.go +++ b/vendor/github.com/elastic/go-ucfg/path.go @@ -13,8 +13,8 @@ type cfgPath struct { type field interface { String() string - SetValue(elem value, v value) Error - GetValue(elem value) (value, Error) + SetValue(opt *options, elem value, v value) Error + GetValue(opt *options, elem value) (value, Error) } type namedField struct { @@ -91,13 +91,13 @@ func (i idxField) String() string { return fmt.Sprintf("%d", i.i) } -func (p cfgPath) GetValue(cfg *Config) (value, Error) { +func (p cfgPath) GetValue(cfg *Config, opt *options) (value, Error) { fields := p.fields cur := value(cfgSub{cfg}) for ; len(fields) > 1; fields = fields[1:] { field := fields[0] - next, err := field.GetValue(cur) + next, err := field.GetValue(opt, cur) if err != nil { return nil, err } @@ -110,30 +110,30 @@ func (p cfgPath) GetValue(cfg *Config) (value, Error) { } field := fields[0] - v, err := field.GetValue(cur) + v, err := field.GetValue(opt, cur) if err != nil { return nil, raiseMissing(cfg, field.String()) } return v, nil } -func (n namedField) GetValue(elem value) (value, Error) { - cfg, err := elem.toConfig() +func (n namedField) GetValue(opts *options, elem value) (value, Error) { + cfg, err := elem.toConfig(opts) if err != nil { - return nil, raiseExpectedObject(elem) + return nil, raiseExpectedObject(opts, elem) } return cfg.fields.fields[n.name], nil } -func (i idxField) GetValue(elem value) (value, Error) { - cfg, err := elem.toConfig() +func (i idxField) GetValue(opts *options, elem value) (value, Error) { + cfg, err := elem.toConfig(opts) if err != nil { if i.i == 0 { return elem, nil } - return nil, raiseExpectedObject(elem) + return nil, raiseExpectedObject(opts, elem) } if i.i >= len(cfg.fields.arr) { @@ -143,14 +143,14 @@ func (i idxField) GetValue(elem value) (value, Error) { return cfg.fields.arr[i.i], nil } -func (p cfgPath) SetValue(cfg *Config, val value) Error { +func (p cfgPath) SetValue(cfg *Config, opt *options, val value) Error { fields := p.fields node := value(cfgSub{cfg}) // 1. iterate until intermediate node not having some required child node for ; len(fields) > 1; fields = fields[1:] { field := fields[0] - v, err := field.GetValue(node) + v, err := field.GetValue(opt, node) if err != nil { if err.Reason() == ErrMissing { break @@ -158,33 +158,34 @@ func (p cfgPath) SetValue(cfg *Config, val value) Error { return err } - if v == nil { + if _, isNil := v.(*cfgNil); v == nil || isNil { break } node = v } // 2. build intermediate nodes from bottom up + for ; len(fields) > 1; fields = fields[:len(fields)-1] { field := fields[len(fields)-1] next := New() next.metadata = val.meta() v := cfgSub{next} - if err := field.SetValue(v, val); err != nil { + if err := field.SetValue(opt, v, val); err != nil { return err } val = v } // 3. insert new sub-tree into config - return fields[0].SetValue(node, val) + return fields[0].SetValue(opt, node, val) } -func (n namedField) SetValue(elem value, v value) Error { +func (n namedField) SetValue(opts *options, elem value, v value) Error { sub, ok := elem.(cfgSub) if !ok { - return raiseExpectedObject(elem) + return raiseExpectedObject(opts, elem) } sub.c.fields.fields[n.name] = v @@ -192,10 +193,10 @@ func (n namedField) SetValue(elem value, v value) Error { return nil } -func (i idxField) SetValue(elem value, v value) Error { +func (i idxField) SetValue(opts *options, elem value, v value) Error { sub, ok := elem.(cfgSub) if !ok { - return raiseExpectedObject(elem) + return raiseExpectedObject(opts, elem) } if i.i >= len(sub.c.fields.arr) { diff --git a/vendor/github.com/urso/ucfg/reify.go b/vendor/github.com/elastic/go-ucfg/reify.go similarity index 66% rename from vendor/github.com/urso/ucfg/reify.go rename to vendor/github.com/elastic/go-ucfg/reify.go index 77f6285e8ae..83d87e82770 100644 --- a/vendor/github.com/urso/ucfg/reify.go +++ b/vendor/github.com/elastic/go-ucfg/reify.go @@ -24,11 +24,11 @@ func (c *Config) Unpack(to interface{}, options ...Option) error { return reifyInto(opts, vTo, c) } -func reifyInto(opts options, to reflect.Value, from *Config) Error { +func reifyInto(opts *options, to reflect.Value, from *Config) Error { to = chaseValuePointers(to) if to, ok := tryTConfig(to); ok { - return mergeConfig(to.Addr().Interface().(*Config), from) + return mergeConfig(opts, to.Addr().Interface().(*Config), from) } tTo := chaseTypePointers(to.Type()) @@ -43,7 +43,7 @@ func reifyInto(opts options, to reflect.Value, from *Config) Error { return raiseInvalidTopLevelType(to.Interface()) } -func reifyMap(opts options, to reflect.Value, from *Config) Error { +func reifyMap(opts *options, to reflect.Value, from *Config) Error { if to.Type().Key().Kind() != reflect.String { return raiseKeyInvalidTypeUnpack(to.Type(), from) } @@ -77,7 +77,7 @@ func reifyMap(opts options, to reflect.Value, from *Config) Error { return nil } -func reifyStruct(opts options, orig reflect.Value, cfg *Config) Error { +func reifyStruct(opts *options, orig reflect.Value, cfg *Config) Error { orig = chaseValuePointers(orig) to := chaseValuePointers(reflect.New(chaseTypePointers(orig.Type()))) @@ -86,7 +86,12 @@ func reifyStruct(opts options, orig reflect.Value, cfg *Config) Error { } if v, ok := implementsUnpacker(to); ok { - if err := unpackWith(v, cfgSub{cfg}.reify()); err != nil { + reified, err := cfgSub{cfg}.reify(opts) + if err != nil { + raisePathErr(err, cfg.metadata, "", cfg.Path(".")) + } + + if err := unpackWith(v, reified); err != nil { return raiseUnsupportedInputType(cfg.ctx, cfg.metadata, v) } } else { @@ -122,7 +127,7 @@ func reifyStruct(opts options, orig reflect.Value, cfg *Config) Error { } if err := tryValidate(to); err != nil { - return raiseValidation(cfg.ctx, cfg.metadata, err) + return raiseValidation(cfg.ctx, cfg.metadata, "", err) } orig.Set(pointerize(orig.Type(), to.Type(), to)) @@ -136,14 +141,17 @@ func reifyGetField( to reflect.Value, ) Error { p := parsePath(name, opts.opts.pathSep) - value, err := p.GetValue(cfg) + value, err := p.GetValue(cfg, opts.opts) if err != nil { - return err + if err.Reason() != ErrMissing { + return err + } + value = nil } if _, ok := value.(*cfgNil); value == nil || ok { if err := runValidators(nil, opts.validators); err != nil { - return raiseValidation(cfg.ctx, cfg.metadata, err) + return raiseValidation(cfg.ctx, cfg.metadata, name, err) } return nil } @@ -163,14 +171,19 @@ func reifyValue( val value, ) (reflect.Value, Error) { if t.Kind() == reflect.Interface && t.NumMethod() == 0 { - return reflect.ValueOf(val.reify()), nil + reified, err := val.reify(opts.opts) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) + } + return reflect.ValueOf(reified), nil } baseType := chaseTypePointers(t) if tConfig.ConvertibleTo(baseType) { - cfg, err := val.toConfig() + cfg, err := val.toConfig(opts.opts) if err != nil { - return reflect.Value{}, raiseExpectedObject(val) + return reflect.Value{}, raiseExpectedObject(opts.opts, val) } v := reflect.ValueOf(cfg).Convert(reflect.PtrTo(baseType)) @@ -183,7 +196,7 @@ func reifyValue( } if baseType.Kind() == reflect.Struct { - sub, err := val.toConfig() + sub, err := val.toConfig(opts.opts) if err != nil { return reifyPrimitive(opts, val, t, baseType) } @@ -201,9 +214,9 @@ func reifyValue( switch baseType.Kind() { case reflect.Map: - sub, err := val.toConfig() + sub, err := val.toConfig(opts.opts) if err != nil { - return reflect.Value{}, raiseExpectedObject(val) + return reflect.Value{}, raiseExpectedObject(opts.opts, val) } if baseType.Key().Kind() != reflect.String { @@ -240,9 +253,9 @@ func reifyMergeValue( baseType := chaseTypePointers(old.Type()) if tConfig.ConvertibleTo(baseType) { - sub, err := val.toConfig() + sub, err := val.toConfig(opts.opts) if err != nil { - return reflect.Value{}, raiseExpectedObject(val) + return reflect.Value{}, raiseExpectedObject(opts.opts, val) } if t == baseType { @@ -252,7 +265,13 @@ func reifyMergeValue( // check if old is nil -> copy reference only if old.Kind() == reflect.Ptr && old.IsNil() { - v := val.reflect().Convert(reflect.PtrTo(baseType)) + v, err := val.reflect(opts.opts) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) + } + + v = v.Convert(reflect.PtrTo(baseType)) return pointerize(t, baseType, v), nil } @@ -263,21 +282,21 @@ func reifyMergeValue( } // old != value -> merge value into old - return oldValue, mergeConfig(subOld, sub) + return oldValue, mergeConfig(opts.opts, subOld, sub) } switch baseType.Kind() { case reflect.Map: - sub, err := val.toConfig() + sub, err := val.toConfig(opts.opts) if err != nil { - return reflect.Value{}, raiseExpectedObject(val) + return reflect.Value{}, raiseExpectedObject(opts.opts, val) } return old, reifyMap(opts.opts, old, sub) case reflect.Struct: - sub, err := val.toConfig() + sub, err := val.toConfig(opts.opts) if err != nil { - return reflect.Value{}, raiseExpectedObject(val) + return reflect.Value{}, raiseExpectedObject(opts.opts, val) } return oldValue, reifyStruct(opts.opts, old, sub) @@ -289,7 +308,13 @@ func reifyMergeValue( } if v, ok := implementsUnpacker(old); ok { - if err := unpackWith(v, val.reify()); err != nil { + reified, err := val.reify(opts.opts) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) + } + + if err := unpackWith(v, reified); err != nil { ctx := val.Context() return reflect.Value{}, raiseUnsupportedInputType(ctx, val.meta(), v) } @@ -303,7 +328,11 @@ func reifyArray( to reflect.Value, tTo reflect.Type, val value, ) (reflect.Value, Error) { - arr := castArr(val) + arr, err := castArr(opts.opts, val) + if err != nil { + return reflect.Value{}, err + } + if len(arr) != tTo.Len() { ctx := val.Context() return reflect.Value{}, raiseArraySize(ctx, val.meta(), len(arr), tTo.Len()) @@ -316,7 +345,11 @@ func reifySlice( tTo reflect.Type, val value, ) (reflect.Value, Error) { - arr := castArr(val) + arr, err := castArr(opts.opts, val) + if err != nil { + return reflect.Value{}, err + } + to := reflect.MakeSlice(tTo, len(arr), len(arr)) return reifyDoArray(opts, to, tTo.Elem(), val, arr) } @@ -337,21 +370,38 @@ func reifyDoArray( if err := runValidators(to.Interface(), opts.validators); err != nil { ctx := val.Context() - return reflect.Value{}, raiseValidation(ctx, val.meta(), err) + return reflect.Value{}, raiseValidation(ctx, val.meta(), "", err) } return to, nil } -func castArr(v value) []value { +func castArr(opts *options, v value) ([]value, Error) { if sub, ok := v.(cfgSub); ok { - return sub.c.fields.arr + return sub.c.fields.arr, nil } + if ref, ok := v.(*cfgRef); ok { + unrefed, err := ref.resolve(opts) + if err != nil { + return nil, raiseMissing(ref.ctx.getParent(), ref.ref.String()) + } - if v.Len() == 0 { - return nil + if sub, ok := unrefed.(cfgSub); ok { + return sub.c.fields.arr, nil + } } - return []value{v} + + l, err := v.Len(opts) + if err != nil { + ctx := v.Context() + return nil, raisePathErr(err, v.meta(), "", ctx.path(".")) + } + + if l == 0 { + return nil, nil + } + + return []value{v}, nil } func reifyPrimitive( @@ -364,29 +414,38 @@ func reifyPrimitive( return pointerize(t, baseType, reflect.Zero(baseType)), nil } - if v, ok := typeIsUnpacker(baseType); ok { - err := unpackWith(v, val.reify()) + var v reflect.Value + var err Error + var ok bool + + if v, ok = typeIsUnpacker(baseType); ok { + reified, err := val.reify(opts.opts) if err != nil { ctx := val.Context() - return reflect.Value{}, raiseUnsupportedInputType(ctx, val.meta(), v) + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) } - return pointerize(t, baseType, chaseValuePointers(v)), nil - } - v, err := doReifyPrimitive(opts, val, baseType) - if err != nil { - return v, err + err = unpackWith(v, reified) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raiseUnsupportedInputType(ctx, val.meta(), v) + } + } else { + v, err = doReifyPrimitive(opts, val, baseType) + if err != nil { + return v, err + } } if err := runValidators(v.Interface(), opts.validators); err != nil { - return reflect.Value{}, raiseValidation(val.Context(), val.meta(), err) + return reflect.Value{}, raiseValidation(val.Context(), val.meta(), "", err) } - if err := tryValidate(v.Interface()); err != nil { - return reflect.Value{}, raiseValidation(val.Context(), val.meta(), err) + if err := tryValidate(v); err != nil { + return reflect.Value{}, raiseValidation(val.Context(), val.meta(), "", err) } - return pointerize(t, baseType, v), nil + return pointerize(t, baseType, chaseValuePointers(v)), nil } func doReifyPrimitive( @@ -394,23 +453,32 @@ func doReifyPrimitive( val value, baseType reflect.Type, ) (reflect.Value, Error) { - extras := map[reflect.Type]func(fieldOptions, value, reflect.Type) (reflect.Value, Error){ tDuration: reifyDuration, tRegexp: reifyRegexp, } + valT, err := val.typ(opts.opts) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) + } + // try primitive conversion kind := baseType.Kind() switch { - case val.typ() == baseType: - v := val.reflect() + case valT.gotype == baseType: + v, err := val.reflect(opts.opts) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) + } return v, nil case kind == reflect.String: - s, err := val.toString() + s, err := val.toString(opts.opts) if err != nil { - return reflect.Value{}, raiseConversion(val, err, "string") + return reflect.Value{}, raiseConversion(opts.opts, val, err, "string") } return reflect.ValueOf(s), nil @@ -435,12 +503,23 @@ func doReifyPrimitive( } return v, nil - case val.typ().ConvertibleTo(baseType): - v := val.reflect().Convert(baseType) + case kind == reflect.Bool: + v, err := reifyBool(opts, val, baseType) + if err != nil { + return v, err + } return v, nil + + case valT.gotype.ConvertibleTo(baseType): + v, err := val.reflect(opts.opts) + if err != nil { + ctx := val.Context() + return reflect.Value{}, raisePathErr(err, val.meta(), "", ctx.path(".")) + } + return v.Convert(baseType), nil } - return reflect.Value{}, raiseToTypeNotSupported(val, baseType) + return reflect.Value{}, raiseToTypeNotSupported(opts.opts, val, baseType) } func reifyDuration( @@ -462,7 +541,7 @@ func reifyDuration( d, err = time.ParseDuration(v.s) default: var s string - s, err = val.toString() + s, err = val.toString(opts.opts) if err != nil { return reflect.Value{}, raiseInvalidDuration(val, err) } @@ -481,9 +560,9 @@ func reifyRegexp( val value, _ reflect.Type, ) (reflect.Value, Error) { - s, err := val.toString() + s, err := val.toString(opts.opts) if err != nil { - return reflect.Value{}, raiseConversion(val, err, "regex") + return reflect.Value{}, raiseConversion(opts.opts, val, err, "regex") } r, err := regexp.Compile(s) @@ -498,14 +577,14 @@ func reifyInt( val value, t reflect.Type, ) (reflect.Value, Error) { - i, err := val.toInt() + i, err := val.toInt(opts.opts) if err != nil { - return reflect.Value{}, raiseConversion(val, err, "int") + return reflect.Value{}, raiseConversion(opts.opts, val, err, "int") } tmp := reflect.Zero(t) if tmp.OverflowInt(i) { - return reflect.Value{}, raiseConversion(val, ErrOverflow, "int") + return reflect.Value{}, raiseConversion(opts.opts, val, ErrOverflow, "int") } return reflect.ValueOf(i).Convert(t), nil } @@ -515,14 +594,26 @@ func reifyUint( val value, t reflect.Type, ) (reflect.Value, Error) { - u, err := val.toUint() + u, err := val.toUint(opts.opts) if err != nil { - return reflect.Value{}, raiseConversion(val, err, "uint") + return reflect.Value{}, raiseConversion(opts.opts, val, err, "uint") } tmp := reflect.Zero(t) if tmp.OverflowUint(u) { - return reflect.Value{}, raiseConversion(val, ErrOverflow, "uint") + return reflect.Value{}, raiseConversion(opts.opts, val, ErrOverflow, "uint") } return reflect.ValueOf(u).Convert(t), nil } + +func reifyBool( + opts fieldOptions, + val value, + t reflect.Type, +) (reflect.Value, Error) { + b, err := val.toBool(opts.opts) + if err != nil { + return reflect.Value{}, raiseConversion(opts.opts, val, err, "bool") + } + return reflect.ValueOf(b).Convert(t), nil +} diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_missing_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_missing_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/arr_oob_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/arr_oob_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/array_size_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/array_size_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/array_size_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/array_size_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/array_size_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/array_size_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/array_size_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/array_size_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/array_size_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/conversion_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/conversion_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/conversion_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/conversion_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/conversion_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/conversion_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/conversion_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/conversion_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/conversion_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/duplicate_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/duplicate_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/duplicate_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/duplicate_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/duplicate_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/duplicate_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/duplicate_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/duplicate_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/duplicate_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/expected_object_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/expected_object_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/expected_object_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/expected_object_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/expected_object_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/expected_object_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/expected_object_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/expected_object_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/expected_object_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/inline_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/inline_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/inline_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/inline_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/inline_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/inline_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/inline_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/inline_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/inline_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_duration_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_duration_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_duration_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_duration_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_duration_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_duration_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_duration_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_duration_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_regexp_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_regexp_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_regexp_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_regexp_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_regexp_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_regexp_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_regexp_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_regexp_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_merge_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_merge_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_top_level.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_top_level.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_top_level.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_top_level.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/invalid_type_unpack_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/invalid_type_unpack_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/missing_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/missing_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/missing_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/missing_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/missing_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/missing_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/missing_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/missing_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/missing_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/nil_config_error.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/nil_config_error.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/nil_config_error.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/nil_config_error.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/nil_value_error.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/nil_value_error.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/nil_value_error.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/nil_value_error.golden diff --git a/vendor/github.com/elastic/go-ucfg/testdata/error/message/parse_splice_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/parse_splice_w_meta.golden new file mode 100644 index 00000000000..0959820095f --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/testdata/error/message/parse_splice_w_meta.golden @@ -0,0 +1 @@ +unterminated brace parsing splice accessing 'nested' \ No newline at end of file diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/pointer_required.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/pointer_required.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/pointer_required.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/pointer_required.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/squash_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/squash_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/squash_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/squash_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/squash_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/squash_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/squash_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/squash_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/squash_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/to_type_not_supported_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/to_type_not_supported_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_nested_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_nested_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_nested_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_nested_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_nested_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_nested_wo_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_w_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_w_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_w_meta.golden diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_wo_meta.golden similarity index 100% rename from vendor/github.com/urso/ucfg/testdata/error/message/unsupported_input_type_wo_meta.golden rename to vendor/github.com/elastic/go-ucfg/testdata/error/message/unsupported_input_type_wo_meta.golden diff --git a/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_w_meta.golden new file mode 100644 index 00000000000..9606efbf03c --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_w_meta.golden @@ -0,0 +1 @@ +invalid value accessing 'nested.test' (source:'test.source') \ No newline at end of file diff --git a/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_wo_meta.golden new file mode 100644 index 00000000000..205c9e8de55 --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_nested_wo_meta.golden @@ -0,0 +1 @@ +invalid value accessing 'nested.test' \ No newline at end of file diff --git a/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_w_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_w_meta.golden new file mode 100644 index 00000000000..38e0a5301d1 --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_w_meta.golden @@ -0,0 +1 @@ +invalid value accessing 'test' (source:'test.source') \ No newline at end of file diff --git a/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_wo_meta.golden b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_wo_meta.golden new file mode 100644 index 00000000000..f137796e78c --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/testdata/error/message/validation_wo_meta.golden @@ -0,0 +1 @@ +invalid value accessing 'test' \ No newline at end of file diff --git a/vendor/github.com/elastic/go-ucfg/types.go b/vendor/github.com/elastic/go-ucfg/types.go new file mode 100644 index 00000000000..b3ea083a837 --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/types.go @@ -0,0 +1,492 @@ +package ucfg + +import ( + "fmt" + "math" + "reflect" + "strconv" +) + +type value interface { + typ(opts *options) (typeInfo, error) + + cpy(c context) value + + Context() context + SetContext(c context) + + meta() *Meta + setMeta(m *Meta) + + Len(opts *options) (int, error) + + reflect(opts *options) (reflect.Value, error) + reify(opts *options) (interface{}, error) + + toBool(opts *options) (bool, error) + toString(opts *options) (string, error) + toInt(opts *options) (int64, error) + toUint(opts *options) (uint64, error) + toFloat(opts *options) (float64, error) + toConfig(opts *options) (*Config, error) +} + +type typeInfo struct { + name string + gotype reflect.Type +} + +type context struct { + parent value + field string +} + +type cfgBool struct { + cfgPrimitive + b bool +} + +type cfgInt struct { + cfgPrimitive + i int64 +} + +type cfgUint struct { + cfgPrimitive + u uint64 +} + +type cfgFloat struct { + cfgPrimitive + f float64 +} + +type cfgString struct { + cfgPrimitive + s string +} + +type cfgSub struct { + c *Config +} + +type cfgRef struct { + cfgPrimitive + ref *reference +} + +type cfgSplice struct { + cfgPrimitive + splice varEvaler +} + +type cfgNil struct{ cfgPrimitive } + +type cfgPrimitive struct { + ctx context + metadata *Meta +} + +func (c *context) empty() bool { + return c.parent == nil +} + +func (c *context) getParent() *Config { + if c.parent == nil { + return nil + } + + if cfg, ok := c.parent.(cfgSub); ok { + return cfg.c + } + return nil +} + +func (c *context) path(sep string) string { + if c.field == "" { + return "" + } + + if c.parent != nil { + p := c.parent.Context() + if parent := p.path(sep); parent != "" { + return fmt.Sprintf("%v%v%v", parent, sep, c.field) + } + } + + return c.field +} + +func (c *context) pathOf(field, sep string) string { + if p := c.path(sep); p != "" { + return fmt.Sprintf("%v%v%v", p, sep, field) + } + return field +} + +func newBool(ctx context, m *Meta, b bool) *cfgBool { + return &cfgBool{cfgPrimitive{ctx, m}, b} +} + +func newInt(ctx context, m *Meta, i int64) *cfgInt { + return &cfgInt{cfgPrimitive{ctx, m}, i} +} + +func newUint(ctx context, m *Meta, u uint64) *cfgUint { + return &cfgUint{cfgPrimitive{ctx, m}, u} +} + +func newFloat(ctx context, m *Meta, f float64) *cfgFloat { + return &cfgFloat{cfgPrimitive{ctx, m}, f} +} + +func newString(ctx context, m *Meta, s string) *cfgString { + return &cfgString{cfgPrimitive{ctx, m}, s} +} + +func newRef(ctx context, m *Meta, ref *reference) *cfgRef { + return &cfgRef{cfgPrimitive{ctx, m}, ref} +} + +func newSplice(ctx context, m *Meta, s varEvaler) *cfgSplice { + return &cfgSplice{cfgPrimitive{ctx, m}, s} +} + +func (p *cfgPrimitive) Context() context { return p.ctx } +func (p *cfgPrimitive) SetContext(c context) { p.ctx = c } +func (p *cfgPrimitive) meta() *Meta { return p.metadata } +func (p *cfgPrimitive) setMeta(m *Meta) { p.metadata = m } +func (cfgPrimitive) Len(*options) (int, error) { return 1, nil } +func (cfgPrimitive) toBool(*options) (bool, error) { return false, ErrTypeMismatch } +func (cfgPrimitive) toString(*options) (string, error) { return "", ErrTypeMismatch } +func (cfgPrimitive) toInt(*options) (int64, error) { return 0, ErrTypeMismatch } +func (cfgPrimitive) toUint(*options) (uint64, error) { return 0, ErrTypeMismatch } +func (cfgPrimitive) toFloat(*options) (float64, error) { return 0, ErrTypeMismatch } +func (cfgPrimitive) toConfig(*options) (*Config, error) { return nil, ErrTypeMismatch } + +func (c *cfgNil) cpy(ctx context) value { return &cfgNil{cfgPrimitive{ctx, c.metadata}} } +func (*cfgNil) Len(*options) (int, error) { return 0, nil } +func (*cfgNil) toString(*options) (string, error) { return "null", nil } +func (*cfgNil) toInt(*options) (int64, error) { return 0, ErrTypeMismatch } +func (*cfgNil) toUint(*options) (uint64, error) { return 0, ErrTypeMismatch } +func (*cfgNil) toFloat(*options) (float64, error) { return 0, ErrTypeMismatch } +func (*cfgNil) reify(*options) (interface{}, error) { return nil, nil } +func (*cfgNil) typ(*options) (typeInfo, error) { return typeInfo{"any", reflect.PtrTo(tConfig)}, nil } +func (c *cfgNil) meta() *Meta { return c.metadata } +func (c *cfgNil) setMeta(m *Meta) { c.metadata = m } + +func (c *cfgNil) reflect(opts *options) (reflect.Value, error) { + cfg, _ := c.toConfig(opts) + return reflect.ValueOf(cfg), nil +} + +func (c *cfgNil) toConfig(*options) (*Config, error) { + n := New() + n.ctx = c.ctx + return n, nil +} + +func (c *cfgBool) cpy(ctx context) value { return newBool(ctx, c.meta(), c.b) } +func (c *cfgBool) toBool(*options) (bool, error) { return c.b, nil } +func (c *cfgBool) reflect(*options) (reflect.Value, error) { return reflect.ValueOf(c.b), nil } +func (c *cfgBool) reify(*options) (interface{}, error) { return c.b, nil } +func (c *cfgBool) toString(*options) (string, error) { return fmt.Sprintf("%t", c.b), nil } +func (c *cfgBool) typ(*options) (typeInfo, error) { return typeInfo{"bool", tBool}, nil } + +func (c *cfgInt) cpy(ctx context) value { return newInt(ctx, c.meta(), c.i) } +func (c *cfgInt) toInt(*options) (int64, error) { return c.i, nil } +func (c *cfgInt) reflect(*options) (reflect.Value, error) { return reflect.ValueOf(c.i), nil } +func (c *cfgInt) reify(*options) (interface{}, error) { return c.i, nil } +func (c *cfgInt) toString(*options) (string, error) { return fmt.Sprintf("%d", c.i), nil } +func (c *cfgInt) typ(*options) (typeInfo, error) { return typeInfo{"int", tInt64}, nil } +func (c *cfgInt) toUint(*options) (uint64, error) { + if c.i < 0 { + return 0, ErrNegative + } + return uint64(c.i), nil +} + +func (c *cfgUint) cpy(ctx context) value { return newUint(ctx, c.meta(), c.u) } +func (c *cfgUint) reflect(*options) (reflect.Value, error) { return reflect.ValueOf(c.u), nil } +func (c *cfgUint) reify(*options) (interface{}, error) { return c.u, nil } +func (c *cfgUint) toString(*options) (string, error) { return fmt.Sprintf("%d", c.u), nil } +func (c *cfgUint) typ(*options) (typeInfo, error) { return typeInfo{"uint", tUint64}, nil } +func (c *cfgUint) toUint(*options) (uint64, error) { return c.u, nil } +func (c *cfgUint) toInt(*options) (int64, error) { + if c.u > math.MaxInt64 { + return 0, ErrOverflow + } + return int64(c.u), nil +} + +func (c *cfgFloat) cpy(ctx context) value { return newFloat(ctx, c.meta(), c.f) } +func (c *cfgFloat) toFloat(*options) (float64, error) { return c.f, nil } +func (c *cfgFloat) reflect(*options) (reflect.Value, error) { return reflect.ValueOf(c.f), nil } +func (c *cfgFloat) reify(*options) (interface{}, error) { return c.f, nil } +func (c *cfgFloat) toString(*options) (string, error) { return fmt.Sprintf("%v", c.f), nil } +func (c *cfgFloat) typ(*options) (typeInfo, error) { return typeInfo{"float", tFloat64}, nil } + +func (c *cfgFloat) toUint(*options) (uint64, error) { + if c.f < 0 { + return 0, ErrNegative + } + if c.f > math.MaxUint64 { + return 0, ErrOverflow + } + return uint64(c.f), nil +} + +func (c *cfgFloat) toInt(*options) (int64, error) { + if c.f < math.MinInt64 || math.MaxInt64 < c.f { + return 0, ErrOverflow + } + return int64(c.f), nil +} + +func (c *cfgString) cpy(ctx context) value { return newString(ctx, c.meta(), c.s) } +func (c *cfgString) toString(*options) (string, error) { return c.s, nil } +func (c *cfgString) reflect(*options) (reflect.Value, error) { + return reflect.ValueOf(c.s), nil +} +func (c *cfgString) reify(*options) (interface{}, error) { return c.s, nil } +func (c *cfgString) typ(*options) (typeInfo, error) { return typeInfo{"string", tString}, nil } + +func (cfgSub) Len(*options) (int, error) { return 1, nil } +func (c cfgSub) Context() context { return c.c.ctx } +func (cfgSub) toBool(*options) (bool, error) { return false, ErrTypeMismatch } +func (cfgSub) toString(*options) (string, error) { return "", ErrTypeMismatch } +func (cfgSub) toInt(*options) (int64, error) { return 0, ErrTypeMismatch } +func (cfgSub) toUint(*options) (uint64, error) { return 0, ErrTypeMismatch } +func (cfgSub) toFloat(*options) (float64, error) { return 0, ErrTypeMismatch } +func (c cfgSub) toConfig(*options) (*Config, error) { return c.c, nil } + +func (c cfgSub) typ(*options) (typeInfo, error) { + return typeInfo{"object", reflect.PtrTo(tConfig)}, nil +} + +// func (cfgSub) typ() (typeInfo, error) { return typeInfo{"object", reflect.PtrTo(tConfig)}, nil } +func (c cfgSub) reflect(*options) (reflect.Value, error) { return reflect.ValueOf(c.c), nil } +func (c cfgSub) meta() *Meta { return c.c.metadata } +func (c cfgSub) setMeta(m *Meta) { c.c.metadata = m } + +func (c cfgSub) cpy(ctx context) value { + newC := cfgSub{ + c: &Config{ctx: ctx, metadata: c.c.metadata}, + } + + fields := &fields{ + fields: map[string]value{}, + arr: make([]value, len(c.c.fields.arr)), + } + + for name, f := range c.c.fields.fields { + ctx := f.Context() + fields.fields[name] = f.cpy(context{field: ctx.field, parent: newC}) + } + for i, f := range c.c.fields.arr { + ctx := f.Context() + fields.arr[i] = f.cpy(context{field: ctx.field, parent: newC}) + } + + newC.c.fields = fields + return newC +} + +func (c cfgSub) SetContext(ctx context) { + if c.c.ctx.empty() { + c.c.ctx = ctx + } else { + c.c = &Config{ + ctx: ctx, + fields: c.c.fields, + } + } +} + +func (c cfgSub) reify(opts *options) (interface{}, error) { + fields := c.c.fields.fields + arr := c.c.fields.arr + + switch { + case len(fields) == 0 && len(arr) == 0: + return nil, nil + case len(fields) > 0 && len(arr) == 0: + m := make(map[string]interface{}) + for k, v := range c.c.fields.fields { + var err error + if m[k], err = v.reify(opts); err != nil { + return nil, err + } + } + return m, nil + case len(fields) == 0 && len(arr) > 0: + m := make([]interface{}, len(arr)) + for i, v := range arr { + var err error + if m[i], err = v.reify(opts); err != nil { + return nil, err + } + } + return m, nil + default: + m := make(map[string]interface{}) + for k, v := range c.c.fields.fields { + var err error + if m[k], err = v.reify(opts); err != nil { + return nil, err + } + } + for i, v := range arr { + var err error + m[fmt.Sprintf("%d", i)], err = v.reify(opts) + if err != nil { + return nil, err + } + } + return m, nil + } +} + +func (r *cfgRef) typ(opt *options) (typeInfo, error) { + v, err := r.resolve(opt) + if err != nil { + return typeInfo{}, err + } + return v.typ(opt) +} + +func (r *cfgRef) cpy(ctx context) value { + return newRef(ctx, r.meta(), r.ref) +} + +func (r *cfgRef) Len(opt *options) (int, error) { + v, err := r.resolve(opt) + if err != nil { + return 0, err + } + return v.Len(opt) +} + +func (r *cfgRef) reflect(opts *options) (reflect.Value, error) { + v, err := r.resolve(opts) + if err != nil { + return reflect.Value{}, err + } + return v.reflect(opts) +} + +func (r *cfgRef) reify(opts *options) (interface{}, error) { + v, err := r.resolve(opts) + if err != nil { + return reflect.Value{}, err + } + return v.reify(opts) +} + +func (r *cfgRef) toBool(opts *options) (bool, error) { + v, err := r.resolve(opts) + if err != nil { + return false, err + } + return v.toBool(opts) +} + +func (r *cfgRef) toString(opts *options) (string, error) { + v, err := r.resolve(opts) + if err != nil { + return "", err + } + return v.toString(opts) +} + +func (r *cfgRef) toInt(opts *options) (int64, error) { + v, err := r.resolve(opts) + if err != nil { + return 0, err + } + return v.toInt(opts) +} + +func (r *cfgRef) toUint(opts *options) (uint64, error) { + v, err := r.resolve(opts) + if err != nil { + return 0, err + } + return v.toUint(opts) +} + +func (r *cfgRef) toFloat(opts *options) (float64, error) { + v, err := r.resolve(opts) + if err != nil { + return 0, err + } + return v.toFloat(opts) +} + +func (r *cfgRef) toConfig(opts *options) (*Config, error) { + v, err := r.resolve(opts) + if err != nil { + return nil, err + } + return v.toConfig(opts) +} + +func (r *cfgRef) resolve(opts *options) (value, error) { + return r.ref.resolve(r.ctx.getParent(), opts) +} + +func (*cfgSplice) typ(*options) (typeInfo, error) { + return typeInfo{"string", tString}, nil +} + +func (s *cfgSplice) cpy(ctx context) value { + return newSplice(ctx, s.meta(), s.splice) +} + +func (s *cfgSplice) reflect(opt *options) (reflect.Value, error) { + str, err := s.toString(opt) + if err != nil { + return reflect.Value{}, err + } + return reflect.ValueOf(str), err +} + +func (s *cfgSplice) reify(opt *options) (interface{}, error) { + return s.toString(opt) +} + +func (s *cfgSplice) toBool(opt *options) (bool, error) { + str, err := s.toString(opt) + if err != nil { + return false, err + } + return strconv.ParseBool(str) +} + +func (s *cfgSplice) toString(opts *options) (string, error) { + return s.splice.eval(s.ctx.getParent(), opts) +} + +func (s *cfgSplice) toInt(opt *options) (int64, error) { + str, err := s.toString(opt) + if err != nil { + return 0, err + } + return strconv.ParseInt(str, 0, 64) +} + +func (s *cfgSplice) toUint(opt *options) (uint64, error) { + str, err := s.toString(opt) + if err != nil { + return 0, err + } + return strconv.ParseUint(str, 0, 64) +} + +func (s *cfgSplice) toFloat(opt *options) (float64, error) { + str, err := s.toString(opt) + if err != nil { + return 0, err + } + return strconv.ParseFloat(str, 64) +} diff --git a/vendor/github.com/urso/ucfg/ucfg.go b/vendor/github.com/elastic/go-ucfg/ucfg.go similarity index 98% rename from vendor/github.com/urso/ucfg/ucfg.go rename to vendor/github.com/elastic/go-ucfg/ucfg.go index 56b588d7c9e..781fbf40f81 100644 --- a/vendor/github.com/urso/ucfg/ucfg.go +++ b/vendor/github.com/elastic/go-ucfg/ucfg.go @@ -13,7 +13,7 @@ type Config struct { } type fieldOptions struct { - opts options + opts *options tag tagOptions validators []validatorTag } diff --git a/vendor/github.com/urso/ucfg/util.go b/vendor/github.com/elastic/go-ucfg/util.go similarity index 100% rename from vendor/github.com/urso/ucfg/util.go rename to vendor/github.com/elastic/go-ucfg/util.go diff --git a/vendor/github.com/urso/ucfg/validator.go b/vendor/github.com/elastic/go-ucfg/validator.go similarity index 94% rename from vendor/github.com/urso/ucfg/validator.go rename to vendor/github.com/elastic/go-ucfg/validator.go index 5704fdd1dfc..d1adb54ea1b 100644 --- a/vendor/github.com/urso/ucfg/validator.go +++ b/vendor/github.com/elastic/go-ucfg/validator.go @@ -72,11 +72,21 @@ func parseValidatorTags(tag string) ([]validatorTag, error) { return tags, nil } -func tryValidate(val interface{}) error { - if v, ok := val.(Validator); ok { - return v.Validate() +func tryValidate(val reflect.Value) error { + t := val.Type() + var validator Validator + + if t.Implements(tValidator) { + validator = val.Interface().(Validator) + } else if reflect.PtrTo(t).Implements(tValidator) { + val = pointerize(reflect.PtrTo(t), t, val) + validator = val.Interface().(Validator) } - return nil + + if validator == nil { + return nil + } + return validator.Validate() } func runValidators(val interface{}, validators []validatorTag) error { diff --git a/vendor/github.com/elastic/go-ucfg/variables.go b/vendor/github.com/elastic/go-ucfg/variables.go new file mode 100644 index 00000000000..d12c12d61a5 --- /dev/null +++ b/vendor/github.com/elastic/go-ucfg/variables.go @@ -0,0 +1,452 @@ +package ucfg + +import ( + "bytes" + "errors" + "fmt" + "strings" +) + +type reference struct { + Path cfgPath +} + +type expansion struct { + left, right varEvaler + pathSep string +} + +type expansionSingle struct { + evaler varEvaler + pathSep string +} + +type expansionDefault struct{ expansion } +type expansionAlt struct{ expansion } +type expansionErr struct{ expansion } + +type splice struct { + pieces []varEvaler +} + +type varEvaler interface { + eval(cfg *Config, opts *options) (string, error) +} + +type constExp string + +type token struct { + typ tokenType + val string +} + +type parseState struct { + st int + isvar bool + op string + pieces [2][]varEvaler +} + +var ( + errUnterminatedBrace = errors.New("unterminated brace") + errInvalidType = errors.New("invalid type") + errEmptyPath = errors.New("empty path after expansion") +) + +type tokenType uint16 + +const ( + tokOpen tokenType = iota + tokClose + tokSep + tokString + + // parser state + stLeft = 0 + stRight = 1 + + opDefault = ":" + opAlternative = ":+" + opError = ":?" +) + +var ( + openToken = token{tokOpen, "${"} + closeToken = token{tokClose, "}"} + + sepDefToken = token{tokSep, opDefault} + sepAltToken = token{tokSep, opAlternative} + sepErrToken = token{tokSep, opError} +) + +func newReference(p cfgPath) *reference { + return &reference{p} +} + +func (r *reference) String() string { + return fmt.Sprintf("${%v}", r.Path) +} + +func (r *reference) resolve(cfg *Config, opts *options) (value, error) { + env := opts.env + var err error + + for { + var v value + cfg = cfgRoot(cfg) + if cfg == nil { + return nil, ErrMissing + } + + v, err = r.Path.GetValue(cfg, opts) + if err == nil { + if v == nil { + break + } + return v, nil + } + + if len(env) == 0 { + break + } + + cfg = env[len(env)-1] + env = env[:len(env)-1] + } + + // try callbacks + if len(opts.resolvers) > 0 { + key := r.Path.String() + for i := len(opts.resolvers) - 1; i >= 0; i-- { + var v string + resolver := opts.resolvers[i] + v, err = resolver(key) + if err == nil { + return newString(context{field: key}, nil, v), nil + } + } + } + + return nil, err +} + +func (r *reference) eval(cfg *Config, opts *options) (string, error) { + v, err := r.resolve(cfg, opts) + if err != nil { + return "", err + } + if v == nil { + return "", fmt.Errorf("can not resolve reference: %v", r.Path) + } + return v.toString(opts) +} + +func (s constExp) eval(*Config, *options) (string, error) { + return string(s), nil +} + +func (s *splice) String() string { + return fmt.Sprintf("%v", s.pieces) +} + +func (s *splice) eval(cfg *Config, opts *options) (string, error) { + buf := bytes.NewBuffer(nil) + for _, p := range s.pieces { + s, err := p.eval(cfg, opts) + if err != nil { + return "", err + } + buf.WriteString(s) + } + return buf.String(), nil +} + +func (e *expansion) String() string { + return fmt.Sprintf("${%v:%v}", e.left, e.right) +} + +func (e *expansionSingle) String() string { + return fmt.Sprintf("${%v}", e.evaler) +} + +func (e *expansionSingle) eval(cfg *Config, opts *options) (string, error) { + path, err := e.evaler.eval(cfg, opts) + if err != nil { + return "", err + } + + ref := newReference(parsePath(path, e.pathSep)) + return ref.eval(cfg, opts) +} + +func (e *expansionDefault) eval(cfg *Config, opts *options) (string, error) { + path, err := e.left.eval(cfg, opts) + if err != nil || path == "" { + return e.right.eval(cfg, opts) + } + ref := newReference(parsePath(path, e.pathSep)) + v, err := ref.eval(cfg, opts) + if err != nil || v == "" { + return e.right.eval(cfg, opts) + } + return v, err +} + +func (e *expansionAlt) eval(cfg *Config, opts *options) (string, error) { + path, err := e.left.eval(cfg, opts) + if err != nil || path == "" { + return "", nil + } + + ref := newReference(parsePath(path, e.pathSep)) + tmp, err := ref.resolve(cfg, opts) + if err != nil || tmp == nil { + return "", nil + } + + return e.right.eval(cfg, opts) +} + +func (e *expansionErr) eval(cfg *Config, opts *options) (string, error) { + path, err := e.left.eval(cfg, opts) + if err == nil && path != "" { + ref := newReference(parsePath(path, e.pathSep)) + str, err := ref.eval(cfg, opts) + if err == nil && str != "" { + return str, nil + } + } + + errStr, err := e.right.eval(cfg, opts) + if err != nil { + return "", err + } + return "", errors.New(errStr) +} + +func (st parseState) finalize(pathSep string) (varEvaler, error) { + if !st.isvar { + return nil, errors.New("fatal: processing non-variable state") + } + if len(st.pieces[stLeft]) == 0 { + return nil, errors.New("empty expansion") + } + + if st.st == stLeft { + pieces := st.pieces[stLeft] + + if len(pieces) == 0 { + return constExp(""), nil + } + + if len(pieces) == 1 { + if str, ok := pieces[0].(constExp); ok { + return newReference(parsePath(string(str), pathSep)), nil + } + } + + return &expansionSingle{&splice{pieces}, pathSep}, nil + } + + extract := func(pieces []varEvaler) varEvaler { + switch len(pieces) { + case 0: + return constExp("") + case 1: + return pieces[0] + default: + return &splice{pieces} + } + } + + left := extract(st.pieces[stLeft]) + right := extract(st.pieces[stRight]) + return makeOpExpansion(left, right, st.op, pathSep), nil +} + +func makeOpExpansion(l, r varEvaler, op, pathSep string) varEvaler { + exp := expansion{l, r, pathSep} + switch op { + case opDefault: + return &expansionDefault{exp} + case opAlternative: + return &expansionAlt{exp} + case opError: + return &expansionErr{exp} + } + panic(fmt.Sprintf("Unknown operator: %v", op)) +} + +func parseSplice(in, pathSep string) (varEvaler, error) { + lex, errs := lexer(in) + defer func() { + // on parser error drain lexer so go-routine won't leak + for range lex { + } + }() + + pieces, perr := parseVarExp(lex, pathSep) + + // check for lexer errors + err := <-errs + if err != nil { + return nil, err + } + + // return parser result + return pieces, perr +} + +func lexer(in string) (<-chan token, <-chan error) { + lex := make(chan token, 1) + errors := make(chan error, 1) + + go func() { + off := 0 + content := in + + defer func() { + if len(content) > 0 { + lex <- token{tokString, content} + } + close(lex) + close(errors) + }() + + strToken := func(s string) { + if s != "" { + lex <- token{tokString, s} + } + } + + varcount := 0 + for len(content) > 0 { + idx := -1 + if varcount == 0 { + idx = strings.IndexAny(content[off:], "$") + } else { + idx = strings.IndexAny(content[off:], "$:}") + } + if idx < 0 { + return + } + + idx += off + off = idx + 1 + switch content[idx] { + case ':': + if len(content) <= off { // found ':' at end of string + return + } + + strToken(content[:idx]) + switch content[off] { + case '+': + off++ + lex <- sepAltToken + case '?': + off++ + lex <- sepErrToken + default: + lex <- sepDefToken + } + + case '}': + strToken(content[:idx]) + lex <- closeToken + varcount-- + + case '$': + if len(content) <= off { // found '$' at end of string + return + } + + switch content[off] { + case '$': // escape '$' symbol + content = content[:off] + content[off+1:] + continue + case '{': // start variable + strToken(content[:idx]) + lex <- openToken + off++ + varcount++ + } + } + + content = content[off:] + off = 0 + } + }() + + return lex, errors +} + +func parseVarExp(lex <-chan token, pathSep string) (varEvaler, error) { + stack := []parseState{ + parseState{st: stLeft}, + } + + // parser loop + for tok := range lex { + switch tok.typ { + case tokOpen: + stack = append(stack, parseState{st: stLeft, isvar: true}) + case tokClose: + // finalize and pop state + piece, err := stack[len(stack)-1].finalize(pathSep) + stack = stack[:len(stack)-1] + if err != nil { + return nil, err + } + + // append result top stacked state + st := &stack[len(stack)-1] + st.pieces[st.st] = append(st.pieces[st.st], piece) + + case tokSep: // switch from left to right + st := &stack[len(stack)-1] + if !st.isvar { + return nil, errors.New("default separator not within expansion") + } + if st.st == stRight { + return nil, errors.New("unexpected ':'") + } + st.st = stRight + st.op = tok.val + + case tokString: + // append raw string + st := &stack[len(stack)-1] + st.pieces[st.st] = append(st.pieces[st.st], constExp(tok.val)) + } + } + + // validate and return final state + if len(stack) > 1 { + return nil, errors.New("missing '}'") + } + if len(stack) == 0 { + return nil, errors.New("fatal: expansion parse state empty") + } + + result := stack[0].pieces[stLeft] + if len(result) == 1 { + return result[0], nil + } + return &splice{result}, nil +} + +func cfgRoot(cfg *Config) *Config { + if cfg == nil { + return nil + } + + for { + p := cfg.Parent() + if p == nil { + return cfg + } + + cfg = p + } +} diff --git a/vendor/github.com/urso/ucfg/yaml/yaml.go b/vendor/github.com/elastic/go-ucfg/yaml/yaml.go similarity index 94% rename from vendor/github.com/urso/ucfg/yaml/yaml.go rename to vendor/github.com/elastic/go-ucfg/yaml/yaml.go index 25437ec75a4..d5449e0e110 100644 --- a/vendor/github.com/urso/ucfg/yaml/yaml.go +++ b/vendor/github.com/elastic/go-ucfg/yaml/yaml.go @@ -3,7 +3,7 @@ package yaml import ( "io/ioutil" - "github.com/urso/ucfg" + "github.com/elastic/go-ucfg" "gopkg.in/yaml.v2" ) diff --git a/vendor/github.com/urso/ucfg/README.md b/vendor/github.com/urso/ucfg/README.md deleted file mode 100644 index 0296061d76d..00000000000 --- a/vendor/github.com/urso/ucfg/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# ucfg - -[![Build -Status](https://travis-ci.org/urso/ucfg.svg?branch=master)](https://travis-ci.org/urso/ucfg) - -[![Go Report -Card](https://goreportcard.com/badge/github.com/urso/ucfg)](https://goreportcard.com/report/github.com/urso/ucfg) - diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_w_meta.golden b/vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_w_meta.golden deleted file mode 100644 index a3cf5d09fbd..00000000000 --- a/vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_w_meta.golden +++ /dev/null @@ -1 +0,0 @@ -invalid value accessing 'nested' (source:'test.source') \ No newline at end of file diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_wo_meta.golden b/vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_wo_meta.golden deleted file mode 100644 index dfb4877815a..00000000000 --- a/vendor/github.com/urso/ucfg/testdata/error/message/validation_nested_wo_meta.golden +++ /dev/null @@ -1 +0,0 @@ -invalid value accessing 'nested' \ No newline at end of file diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/validation_w_meta.golden b/vendor/github.com/urso/ucfg/testdata/error/message/validation_w_meta.golden deleted file mode 100644 index e0495a4b43f..00000000000 --- a/vendor/github.com/urso/ucfg/testdata/error/message/validation_w_meta.golden +++ /dev/null @@ -1 +0,0 @@ -invalid value accessing config (source:'test.source') \ No newline at end of file diff --git a/vendor/github.com/urso/ucfg/testdata/error/message/validation_wo_meta.golden b/vendor/github.com/urso/ucfg/testdata/error/message/validation_wo_meta.golden deleted file mode 100644 index af81009b97b..00000000000 --- a/vendor/github.com/urso/ucfg/testdata/error/message/validation_wo_meta.golden +++ /dev/null @@ -1 +0,0 @@ -invalid value accessing config \ No newline at end of file diff --git a/vendor/github.com/urso/ucfg/types.go b/vendor/github.com/urso/ucfg/types.go deleted file mode 100644 index 0717386ad32..00000000000 --- a/vendor/github.com/urso/ucfg/types.go +++ /dev/null @@ -1,310 +0,0 @@ -package ucfg - -import ( - "fmt" - "math" - "reflect" -) - -type value interface { - cpy(c context) value - - Context() context - SetContext(c context) - - meta() *Meta - setMeta(m *Meta) - - Len() int - - reflect() reflect.Value - typ() reflect.Type - reify() interface{} - - typeName() string - - toBool() (bool, error) - toString() (string, error) - toInt() (int64, error) - toUint() (uint64, error) - toFloat() (float64, error) - toConfig() (*Config, error) -} - -type context struct { - parent value - field string -} - -/* -type cfgArray struct { - cfgPrimitive - arr []value -} -*/ - -type cfgBool struct { - cfgPrimitive - b bool -} - -type cfgInt struct { - cfgPrimitive - i int64 -} - -type cfgUint struct { - cfgPrimitive - u uint64 -} - -type cfgFloat struct { - cfgPrimitive - f float64 -} - -type cfgString struct { - cfgPrimitive - s string -} - -type cfgSub struct { - c *Config -} - -type cfgNil struct{ cfgPrimitive } - -type cfgPrimitive struct { - ctx context - metadata *Meta -} - -func (c *context) empty() bool { - return c.parent == nil -} - -func (c *context) path(sep string) string { - if c.field == "" { - return "" - } - - if c.parent != nil { - p := c.parent.Context() - if parent := p.path(sep); parent != "" { - return fmt.Sprintf("%v%v%v", parent, sep, c.field) - } - } - - return c.field -} - -func (c *context) pathOf(field, sep string) string { - if p := c.path(sep); p != "" { - return fmt.Sprintf("%v%v%v", p, sep, field) - } - return field -} - -func newBool(ctx context, m *Meta, b bool) *cfgBool { - return &cfgBool{cfgPrimitive{ctx, m}, b} -} - -func newInt(ctx context, m *Meta, i int64) *cfgInt { - return &cfgInt{cfgPrimitive{ctx, m}, i} -} - -func newUint(ctx context, m *Meta, u uint64) *cfgUint { - return &cfgUint{cfgPrimitive{ctx, m}, u} -} - -func newFloat(ctx context, m *Meta, f float64) *cfgFloat { - return &cfgFloat{cfgPrimitive{ctx, m}, f} -} - -func newString(ctx context, m *Meta, s string) *cfgString { - return &cfgString{cfgPrimitive{ctx, m}, s} -} - -func (p *cfgPrimitive) Context() context { return p.ctx } -func (p *cfgPrimitive) SetContext(c context) { p.ctx = c } -func (p *cfgPrimitive) meta() *Meta { return p.metadata } -func (p *cfgPrimitive) setMeta(m *Meta) { p.metadata = m } -func (cfgPrimitive) Len() int { return 1 } -func (cfgPrimitive) toBool() (bool, error) { return false, ErrTypeMismatch } -func (cfgPrimitive) toString() (string, error) { return "", ErrTypeMismatch } -func (cfgPrimitive) toInt() (int64, error) { return 0, ErrTypeMismatch } -func (cfgPrimitive) toUint() (uint64, error) { return 0, ErrTypeMismatch } -func (cfgPrimitive) toFloat() (float64, error) { return 0, ErrTypeMismatch } -func (cfgPrimitive) toConfig() (*Config, error) { return nil, ErrTypeMismatch } - -/* -func (cfgArray) typeName() string { return "array" } -func (c *cfgArray) Len() int { return len(c.arr) } -func (c *cfgArray) reflect() reflect.Value { return reflect.ValueOf(c.arr) } -func (cfgArray) typ() reflect.Type { return tInterfaceArray } - -func (c *cfgArray) cpy(ctx context) value { - return &cfgArray{cfgPrimitive{ctx, c.meta()}, c.arr} -} - -func (c *cfgArray) reify() interface{} { - r := make([]interface{}, len(c.arr)) - for i, v := range c.arr { - r[i] = v.reify() - } - return r -} -*/ - -func (c *cfgNil) cpy(ctx context) value { return &cfgNil{cfgPrimitive{ctx, c.metadata}} } -func (*cfgNil) Len() int { return 0 } -func (*cfgNil) typeName() string { return "any" } -func (*cfgNil) toString() (string, error) { return "null", nil } -func (*cfgNil) toInt() (int64, error) { return 0, ErrTypeMismatch } -func (*cfgNil) toUint() (uint64, error) { return 0, ErrTypeMismatch } -func (*cfgNil) toFloat() (float64, error) { return 0, ErrTypeMismatch } -func (*cfgNil) reify() interface{} { return nil } -func (*cfgNil) typ() reflect.Type { return reflect.PtrTo(tConfig) } -func (c *cfgNil) meta() *Meta { return c.metadata } -func (c *cfgNil) setMeta(m *Meta) { c.metadata = m } - -func (c *cfgNil) reflect() reflect.Value { - cfg, _ := c.toConfig() - return reflect.ValueOf(cfg) -} - -func (c *cfgNil) toConfig() (*Config, error) { - n := New() - n.ctx = c.ctx - return n, nil -} - -func (c *cfgBool) cpy(ctx context) value { return newBool(ctx, c.meta(), c.b) } -func (*cfgBool) typeName() string { return "bool" } -func (c *cfgBool) toBool() (bool, error) { return c.b, nil } -func (c *cfgBool) reflect() reflect.Value { return reflect.ValueOf(c.b) } -func (c *cfgBool) reify() interface{} { return c.b } -func (c *cfgBool) toString() (string, error) { return fmt.Sprintf("%t", c.b), nil } -func (c *cfgBool) typ() reflect.Type { return tBool } - -func (c *cfgInt) cpy(ctx context) value { return newInt(ctx, c.meta(), c.i) } -func (*cfgInt) typeName() string { return "int" } -func (c *cfgInt) toInt() (int64, error) { return c.i, nil } -func (c *cfgInt) reflect() reflect.Value { return reflect.ValueOf(c.i) } -func (c *cfgInt) reify() interface{} { return c.i } -func (c *cfgInt) toString() (string, error) { return fmt.Sprintf("%d", c.i), nil } -func (c *cfgInt) typ() reflect.Type { return tInt64 } -func (c *cfgInt) toUint() (uint64, error) { - if c.i < 0 { - return 0, ErrNegative - } - return uint64(c.i), nil -} - -func (c *cfgUint) cpy(ctx context) value { return newUint(ctx, c.meta(), c.u) } -func (c *cfgUint) typeName() string { return "uint" } -func (c *cfgUint) reflect() reflect.Value { return reflect.ValueOf(c.u) } -func (c *cfgUint) reify() interface{} { return c.u } -func (c *cfgUint) toString() (string, error) { return fmt.Sprintf("%d", c.u), nil } -func (c *cfgUint) typ() reflect.Type { return tUint64 } -func (c *cfgUint) toUint() (uint64, error) { return c.u, nil } -func (c *cfgUint) toInt() (int64, error) { - if c.u > math.MaxInt64 { - return 0, ErrOverflow - } - return int64(c.u), nil -} - -func (c *cfgFloat) cpy(ctx context) value { return newFloat(ctx, c.meta(), c.f) } -func (*cfgFloat) typeName() string { return "float" } -func (c *cfgFloat) toFloat() (float64, error) { return c.f, nil } -func (c *cfgFloat) reflect() reflect.Value { return reflect.ValueOf(c.f) } -func (c *cfgFloat) reify() interface{} { return c.f } -func (c *cfgFloat) toString() (string, error) { return fmt.Sprintf("%v", c.f), nil } -func (c *cfgFloat) typ() reflect.Type { return tFloat64 } - -func (c *cfgFloat) toUint() (uint64, error) { - if c.f < 0 { - return 0, ErrNegative - } - if c.f > math.MaxUint64 { - return 0, ErrOverflow - } - return uint64(c.f), nil -} - -func (c *cfgFloat) toInt() (int64, error) { - if c.f < math.MinInt64 || math.MaxInt64 < c.f { - return 0, ErrOverflow - } - return int64(c.f), nil -} - -func (c *cfgString) cpy(ctx context) value { return newString(ctx, c.meta(), c.s) } -func (*cfgString) typeName() string { return "string" } -func (c *cfgString) toString() (string, error) { return c.s, nil } -func (c *cfgString) reflect() reflect.Value { return reflect.ValueOf(c.s) } -func (c *cfgString) reify() interface{} { return c.s } -func (c *cfgString) typ() reflect.Type { return tString } - -func (cfgSub) Len() int { return 1 } -func (cfgSub) typeName() string { return "object" } -func (c cfgSub) Context() context { return c.c.ctx } -func (cfgSub) toBool() (bool, error) { return false, ErrTypeMismatch } -func (cfgSub) toString() (string, error) { return "", ErrTypeMismatch } -func (cfgSub) toInt() (int64, error) { return 0, ErrTypeMismatch } -func (cfgSub) toUint() (uint64, error) { return 0, ErrTypeMismatch } -func (cfgSub) toFloat() (float64, error) { return 0, ErrTypeMismatch } -func (c cfgSub) toConfig() (*Config, error) { return c.c, nil } -func (cfgSub) typ() reflect.Type { return reflect.PtrTo(tConfig) } -func (c cfgSub) reflect() reflect.Value { return reflect.ValueOf(c.c) } -func (c cfgSub) meta() *Meta { return c.c.metadata } -func (c cfgSub) setMeta(m *Meta) { c.c.metadata = m } - -func (c cfgSub) cpy(ctx context) value { - return cfgSub{ - c: &Config{ctx: ctx, fields: c.c.fields, metadata: c.c.metadata}, - } -} - -func (c cfgSub) SetContext(ctx context) { - if c.c.ctx.empty() { - c.c.ctx = ctx - } else { - c.c = &Config{ - ctx: ctx, - fields: c.c.fields, - } - } -} - -func (c cfgSub) reify() interface{} { - fields := c.c.fields.fields - arr := c.c.fields.arr - - switch { - case len(fields) == 0 && len(arr) == 0: - return nil - case len(fields) > 0 && len(arr) == 0: - m := make(map[string]interface{}) - for k, v := range c.c.fields.fields { - m[k] = v.reify() - } - return m - case len(fields) == 0 && len(arr) > 0: - m := make([]interface{}, len(arr)) - for i, v := range arr { - m[i] = v.reify() - } - return m - default: - m := make(map[string]interface{}) - for k, v := range c.c.fields.fields { - m[k] = v.reify() - } - for i, v := range arr { - m[fmt.Sprintf("%d", i)] = v.reify() - } - return m - } -}