From 5401218591dfd92a4c69d2187eaf7b936ad3f471 Mon Sep 17 00:00:00 2001 From: Milad Rahimi Date: Thu, 7 Apr 2022 23:26:38 +0430 Subject: [PATCH] fix issue #37 (#38) Fix issue #37 --- container.go | 20 ++++++++++---------- container_test.go | 27 ++++++++++++++++++++------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/container.go b/container.go index 9c80dd4..167b0a2 100644 --- a/container.go +++ b/container.go @@ -92,20 +92,20 @@ func (c Container) bind(resolver interface{}, name string, singleton bool) error return errors.New("container: the resolver must be a function") } - for i := 0; i < reflectedResolver.NumOut(); i++ { - if _, exist := c[reflectedResolver.Out(i)]; !exist { - c[reflectedResolver.Out(i)] = make(map[string]binding) + if reflectedResolver.NumOut() > 0 { + if _, exist := c[reflectedResolver.Out(0)]; !exist { + c[reflectedResolver.Out(0)] = make(map[string]binding) } - if singleton { - instance, err := c.invoke(resolver) - if err != nil { - return err - } + instance, err := c.invoke(resolver) + if err != nil { + return err + } - c[reflectedResolver.Out(i)][name] = binding{resolver: resolver, instance: instance} + if singleton { + c[reflectedResolver.Out(0)][name] = binding{resolver: resolver, instance: instance} } else { - c[reflectedResolver.Out(i)][name] = binding{resolver: resolver} + c[reflectedResolver.Out(0)][name] = binding{resolver: resolver} } } diff --git a/container_test.go b/container_test.go index 2d58db8..a34a97a 100644 --- a/container_test.go +++ b/container_test.go @@ -105,6 +105,13 @@ func TestContainer_Singleton(t *testing.T) { assert.NoError(t, err) } +func TestContainer_Singleton_With_Resolve_That_Returns_Error(t *testing.T) { + err := instance.Singleton(func() (Shape, error) { + return nil, errors.New("app: error") + }) + assert.Error(t, err, "app: error") +} + func TestContainer_Singleton_With_NonFunction_Resolver_It_Should_Fail(t *testing.T) { err := instance.Singleton("STRING!") assert.EqualError(t, err, "container: the resolver must be a function") @@ -166,21 +173,27 @@ func TestContainer_Transient_With_Resolve_That_Returns_Error(t *testing.T) { err := instance.Transient(func() (Shape, error) { return nil, errors.New("app: error") }) + assert.Error(t, err, "app: error") + + firstCall := true + err = instance.Transient(func() (Database, error) { + if firstCall { + firstCall = false + return &MySQL{}, nil + } + return nil, errors.New("app: second call error") + }) assert.NoError(t, err) - var s Shape - err = instance.Resolve(&s) - assert.Error(t, err, "app: error") + var db Database + err = instance.Resolve(&db) + assert.Error(t, err, "app: second call error") } func TestContainer_Transient_With_Resolve_With_Invalid_Signature_It_Should_Fail(t *testing.T) { err := instance.Transient(func() (Shape, Database, error) { return nil, nil, nil }) - assert.NoError(t, err) - - var s Shape - err = instance.Resolve(&s) assert.Error(t, err, "container: resolver function signature is invalid") }