Skip to content

Commit

Permalink
Resolver: fill struct fields of type struct with recursive (#12)
Browse files Browse the repository at this point in the history
* resolver: fill slice & map struct fields with recursive

* resolver: fill struct fields of type struct with recursive

Co-authored-by: Sergey Dobrodey <[email protected]>
  • Loading branch information
sergeydobrodey and sergeydobrodey authored Jun 29, 2022
1 parent e556f72 commit 373bbc9
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
3 changes: 2 additions & 1 deletion resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}

Expand Down
11 changes: 7 additions & 4 deletions resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 373bbc9

Please sign in to comment.