From bea6ce02ea31ded3a3aaf0bd4daca7c7b9e306d1 Mon Sep 17 00:00:00 2001 From: Tristan Baumbusch Date: Tue, 25 Oct 2022 20:44:31 +0200 Subject: [PATCH] [#7]: failing on usage of struct receiver in 'Inject' method --- dingo.go | 5 +++++ dingo_test.go | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/dingo.go b/dingo.go index 1268bc0..bb8323e 100644 --- a/dingo.go +++ b/dingo.go @@ -15,6 +15,7 @@ const ( DEFAULT ) +var ErrInvalidInjectReceiver = errors.New("usage of 'Inject' method with struct receiver is not allowed") var traceCircular []circularTraceEntry // EnableCircularTracing activates dingo's trace feature to find circular dependencies @@ -693,6 +694,10 @@ func (injector *Injector) requestInjection(object interface{}, circularTrace []c i++ + if ctype.Kind() != reflect.Ptr && current.MethodByName("Inject").IsValid() { + return fmt.Errorf("invalid inject receiver %s: %w", current, ErrInvalidInjectReceiver) + } + switch ctype.Kind() { // dereference pointer case reflect.Ptr: diff --git a/dingo_test.go b/dingo_test.go index bccf85b..967d0a1 100644 --- a/dingo_test.go +++ b/dingo_test.go @@ -313,3 +313,25 @@ func TestInjector_InitModules(t *testing.T) { assert.NoError(t, err) assert.Error(t, injector.InitModules(new(testInjectInvalid))) } + +type TestInjectStructRecInterface interface { + TestXyz() +} + +type testInjectStructRecStruct struct{} + +func (t testInjectStructRecStruct) TestXyz() {} + +func (t testInjectStructRecStruct) Inject() {} + +func TestInjectStructRec(t *testing.T) { + t.Parallel() + + injector, err := NewInjector() + assert.NoError(t, err) + + injector.Bind(new(TestInjectStructRecInterface)).To(new(testInjectStructRecStruct)) + + _, err = injector.GetInstance(new(TestInjectStructRecInterface)) + assert.Error(t, err) +}