Skip to content

Commit cc81f03

Browse files
authored
Support listing enums in specified order (#274)
1 parent 72024dd commit cc81f03

File tree

3 files changed

+24
-6
lines changed

3 files changed

+24
-6
lines changed

context.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -891,16 +891,15 @@ func checkEnum(value *Value, target reflect.Value) error {
891891
return errors.Errorf("enum can only be applied to a slice or value")
892892

893893
default:
894-
enumMap := value.EnumMap()
894+
enumSlice := value.EnumSlice()
895895
v := fmt.Sprintf("%v", target)
896-
if enumMap[v] {
897-
return nil
898-
}
899896
enums := []string{}
900-
for enum := range enumMap {
897+
for _, enum := range enumSlice {
898+
if enum == v {
899+
return nil
900+
}
901901
enums = append(enums, fmt.Sprintf("%q", enum))
902902
}
903-
sort.Strings(enums)
904903
return fmt.Errorf("%s must be one of %s but got %q", value.ShortSummary(), strings.Join(enums, ","), target.Interface())
905904
}
906905
}

kong_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,7 @@ func TestInterpolationIntoModel(t *testing.T) {
663663
require.Equal(t, "Some default value.", flag.Default)
664664
require.Equal(t, "Help, I need chickens!", flag.Help)
665665
require.Equal(t, map[string]bool{"a": true, "b": true, "c": true, "d": true}, flag.EnumMap())
666+
require.Equal(t, []string{"a", "b", "c", "d"}, flag.EnumSlice())
666667
require.Equal(t, "One of a,b", flag2.Help)
667668
require.Equal(t, "SAVE_THE_QUEEN", flag3.Env)
668669
require.Equal(t, "God SAVE_THE_QUEEN", flag3.Help)
@@ -787,6 +788,14 @@ func TestEnum(t *testing.T) {
787788
require.EqualError(t, err, "--flag must be one of \"a\",\"b\",\"c\" but got \"d\"")
788789
}
789790

791+
func TestEnumMeaningfulOrder(t *testing.T) {
792+
var cli struct {
793+
Flag string `enum:"first,second,third,fourth,fifth" required:""`
794+
}
795+
_, err := mustNew(t, &cli).Parse([]string{"--flag", "sixth"})
796+
require.EqualError(t, err, "--flag must be one of \"first\",\"second\",\"third\",\"fourth\",\"fifth\" but got \"sixth\"")
797+
}
798+
790799
type commandWithHook struct {
791800
value string
792801
}

model.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,16 @@ func (v *Value) EnumMap() map[string]bool {
257257
return out
258258
}
259259

260+
// EnumSlice returns a slice of the enums in this value.
261+
func (v *Value) EnumSlice() []string {
262+
parts := strings.Split(v.Enum, ",")
263+
out := make([]string, len(parts))
264+
for i, part := range parts {
265+
out[i] = strings.TrimSpace(part)
266+
}
267+
return out
268+
}
269+
260270
// ShortSummary returns a human-readable summary of the value, not including any placeholders/defaults.
261271
func (v *Value) ShortSummary() string {
262272
if v.Flag != nil {

0 commit comments

Comments
 (0)