From 373bbc98d810ea7d11a88a6d9cb704075b7bc139 Mon Sep 17 00:00:00 2001 From: Sergey Dobrodey Date: Wed, 29 Jun 2022 15:10:41 +0200 Subject: [PATCH] Resolver: fill struct fields of type struct with recursive (#12) * resolver: fill slice & map struct fields with recursive * resolver: fill struct fields of type struct with recursive Co-authored-by: Sergey Dobrodey --- resolver.go | 3 ++- resolver_test.go | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/resolver.go b/resolver.go index 8f65d9f..0b4562b 100644 --- a/resolver.go +++ b/resolver.go @@ -264,7 +264,8 @@ func (self *resolver) fillStruct(receiver interface{}) error { case "recursive": var ptr = reflect.NewAt(elem.Field(i).Type(), unsafe.Pointer(elem.Field(i).UnsafeAddr())).Elem() - if ptr.Kind() == reflect.Slice || ptr.Kind() == reflect.Map { + switch ptr.Kind() { + case reflect.Slice, reflect.Map, reflect.Struct: ptr = ptr.Addr() } diff --git a/resolver_test.go b/resolver_test.go index 25e880b..ac9e1ce 100644 --- a/resolver_test.go +++ b/resolver_test.go @@ -332,13 +332,16 @@ func (suite *ResolverSuite) TestFillInvalidTag() { suite.Require().EqualError(suite.resolver.Fill(&target), `di: S has an invalid struct tag: filling *struct { S di_test.Shape "di:\"invalid\"" }`) } -func (suite *ResolverSuite) TestFillInvalidRecursive() { - suite.Require().NoError(suite.container.Singleton(newRectangle, di.WithName("R"))) +func (suite *ResolverSuite) TestFillRecursiveStruct() { + suite.Require().NoError(suite.container.Singleton(newRectangle)) var target = struct { - R Rectangle `di:"recursive"` + inner struct { + S Shape `di:"type"` + } `di:"recursive"` }{} - suite.Require().EqualError(suite.resolver.Fill(&target), `di: receiver is not a pointer: struct: filling *struct { R di_test.Rectangle "di:\"recursive\"" }`) + suite.Require().NoError(suite.resolver.Fill(&target)) + suite.Require().Equal(newRectangle().GetArea(), target.inner.S.GetArea()) } func (suite *ResolverSuite) TestFillSliceUnbound() {