From 4d571655620e6785b67c708b19e2cf144350ba4b Mon Sep 17 00:00:00 2001 From: joeybloggs Date: Mon, 29 Jun 2015 09:53:08 -0400 Subject: [PATCH] fix wrong variable used in checking for "[" char for #85 --- validator.go | 34 +++++++++++++++++++++++----------- validator_test.go | 5 +++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/validator.go b/validator.go index f70948d..8bbd891 100644 --- a/validator.go +++ b/validator.go @@ -248,7 +248,6 @@ func (e *FieldError) Error() string { // This is now needed because of the new dive functionality func (e *FieldError) Flatten() map[string]*FieldError { - // return e.flatten(false) errs := map[string]*FieldError{} if e.IsPlaceholderErr { @@ -276,18 +275,31 @@ func (e *FieldError) Flatten() map[string]*FieldError { } } } - } if e.IsMap { - // for _, err := range e.MapErrs { - - // if flat := err.Flatten(); flat != nil && len(flat) > 0 { - // for k, v := range flat { - // errs[k] = v - // } - // } - // } + for key, err := range e.MapErrs { + + fe, ok := err.(*FieldError) + + if ok { + + if flat := fe.Flatten(); flat != nil && len(flat) > 0 { + for k, v := range flat { + errs[fmt.Sprintf("[%#v]%s", key, k)] = v + } + } + } else { + + se := err.(*StructErrors) + + if flat := se.flatten(false); flat != nil && len(flat) > 0 { + for k, v := range flat { + errs[fmt.Sprintf("[%#v].%s.%s", key, se.Struct, k)] = v + } + } + } + } } return errs @@ -340,7 +352,7 @@ func (e *StructErrors) flatten(isFromStruct bool) map[string]*FieldError { for k, fe := range flat { - if isFromStruct && f.Field[0:1] == "[" { + if isFromStruct && k[0:1] == "[" { errs[f.Field+k] = fe } else { errs[k] = fe diff --git a/validator_test.go b/validator_test.go index 53ab455..4c4e4a9 100644 --- a/validator_test.go +++ b/validator_test.go @@ -266,6 +266,11 @@ func TestFlattenValidation(t *testing.T) { Equal(t, flatFieldErr.Field, "Name") Equal(t, flatFieldErr.Tag, "required") + structErrFlatten, ok := errs.Flatten()["Errs[0][1].Inner.Name"] + Equal(t, ok, true) + Equal(t, structErrFlatten.Field, "Name") + Equal(t, structErrFlatten.Tag, "required") + // expect Errs[0][1].Inner.Name = error // fmt.Println((fieldErr.SliceOrArrayErrs[0].(*FieldError)).Field) // fmt.Println((fieldErr.SliceOrArrayErrs[0].(*FieldError)).IsPlaceholderErr)