From 3b3b803e9e1422f4f4aa177a8a8328279ea84362 Mon Sep 17 00:00:00 2001 From: Andrii Zhezhel <21112019+zhezhel@users.noreply.github.com> Date: Sun, 3 Sep 2023 19:36:53 +0200 Subject: [PATCH] Mention all missed but required fields in the error (#143) --- aconfig.go | 11 +++++++++-- aconfig_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/aconfig.go b/aconfig.go index a039168..e9f36e9 100644 --- a/aconfig.go +++ b/aconfig.go @@ -261,15 +261,22 @@ func (l *Loader) loadSources() error { } func (l *Loader) checkRequired() error { + missedFields := []string{} for _, field := range l.fields { if field.isSet { continue } if field.isRequired || l.config.AllFieldRequired { - return fmt.Errorf("field %s is required but not set", field.name) + missedFields = append(missedFields, field.name) } } - return nil + if len(missedFields) == 0 { + return nil + } + if len(missedFields) == 1 { + return fmt.Errorf("field %s is required but not set", missedFields[0]) + } + return fmt.Errorf("fields %s are required but not set", strings.Join(missedFields, ",")) } func (l *Loader) loadDefaults() error { diff --git a/aconfig_test.go b/aconfig_test.go index 68c6b2b..33dc53f 100644 --- a/aconfig_test.go +++ b/aconfig_test.go @@ -1087,6 +1087,38 @@ func TestBadRequiredTag(t *testing.T) { f(&TestConfig{}) } +func TestMissingFieldWithRequiredTag(t *testing.T) { + cfg := struct { + Field1 string `required:"true"` + }{} + loader := LoaderFor(&cfg, Config{ + SkipFlags: true, + }) + + err := loader.Load() + + want := "load config: field Field1 is required but not set" + if err.Error() != want { + t.Fatalf("got %v, want %v", err, want) + } +} +func TestMissingFieldsWithRequiredTag(t *testing.T) { + cfg := struct { + Field1 string `required:"true"` + Field2 string `required:"true"` + }{} + loader := LoaderFor(&cfg, Config{ + SkipFlags: true, + }) + + err := loader.Load() + + want := "load config: fields Field1,Field2 are required but not set" + if err.Error() != want { + t.Fatalf("got %v, want %v", err, want) + } +} + func int32Ptr(a int32) *int32 { return &a }