diff --git a/required.go b/required.go index 977131f..1a2def6 100644 --- a/required.go +++ b/required.go @@ -24,13 +24,21 @@ func Required[T any](value T) (T, error) { return value, err } -// reflectRequired checks if the given value is its zero value. It -// returns an error if the value is zero. +// reflectRequired checks if the given value is its zero value, or an +// empty array, map, or slice. It returns an error if so. func reflectRequired(value reflect.Value) (reflect.Value, error) { var err error - if value.IsZero() { - err = ErrRequired + switch value.Kind() { + case reflect.Array, reflect.Map, reflect.Slice: + if value.Len() == 0 { + err = ErrRequired + } + + default: + if value.IsZero() { + err = ErrRequired + } } return value, err diff --git a/required_test.go b/required_test.go index 9966878..4c7a0b8 100644 --- a/required_test.go +++ b/required_test.go @@ -39,3 +39,43 @@ func TestRequiredMissing(t *testing.T) { t.Fatalf("got unexpected error %v", err) } } + +func TestRequiredEmptySlice(t *testing.T) { + value := []string{} + + _, err := v2.Required(value) + + if !errors.Is(err, v2.ErrRequired) { + t.Fatalf("got unexpected error %v", err) + } +} + +func TestRequiredNonEmptySlice(t *testing.T) { + value := []string{"test"} + + _, err := v2.Required(value) + + if err != nil { + t.Fatal(err) + } +} + +func TestRequiredEmptyMap(t *testing.T) { + value := map[string]string{} + + _, err := v2.Required(value) + + if !errors.Is(err, v2.ErrRequired) { + t.Fatalf("got unexpected error %v", err) + } +} + +func TestRequiredNonEmptyMap(t *testing.T) { + value := map[string]string{"key": "value"} + + _, err := v2.Required(value) + + if err != nil { + t.Fatal(err) + } +}