diff --git a/internal/config.go b/internal/config.go index 5d99f99..6d0d405 100644 --- a/internal/config.go +++ b/internal/config.go @@ -176,16 +176,15 @@ func (c *Config) parseUnknownFlag(option string, arg flags.SplitArgument, args [ // Parse rules in the format "rule.." parts := strings.Split(option, ".") if len(parts) == 3 && parts[0] == "rule" { - // Get or create rule - rule, ok := c.Rules[parts[1]] - if !ok { - rule = NewRule() - c.Rules[parts[1]] = rule + // Ensure there is a name + name := parts[1] + if len(name) == 0 { + return args, errors.New("route name is required") } // Get value, or pop the next arg val, ok := arg.Value() - if !ok { + if !ok && len(args) > 1 { val = args[0] args = args[1:] } @@ -204,6 +203,13 @@ func (c *Config) parseUnknownFlag(option string, arg flags.SplitArgument, args [ } } + // Get or create rule + rule, ok := c.Rules[name] + if !ok { + rule = NewRule() + c.Rules[name] = rule + } + // Add param value to rule switch parts[2] { case "action": diff --git a/internal/config_test.go b/internal/config_test.go index c43c5df..6f2d0a0 100644 --- a/internal/config_test.go +++ b/internal/config_test.go @@ -98,6 +98,29 @@ func TestConfigParseUnknownFlags(t *testing.T) { } } +func TestConfigParseRuleError(t *testing.T) { + assert := assert.New(t) + + // Rule without name + _, err := NewConfig([]string{ + "--rule..action=auth", + }) + if assert.Error(err) { + assert.Equal("route name is required", err.Error()) + } + + // Rule without value + c, err := NewConfig([]string{ + "--rule.one.action=", + }) + if assert.Error(err) { + assert.Equal("route param value is required", err.Error()) + } + // Check rules + assert.Equal(map[string]*Rule{}, c.Rules) +} + + func TestConfigFlagBackwardsCompatability(t *testing.T) { assert := assert.New(t) c, err := NewConfig([]string{