Skip to content

Commit 7b3975a

Browse files
Fix slice return
* fix slice return
1 parent bc1a29b commit 7b3975a

File tree

4 files changed

+51
-18
lines changed

4 files changed

+51
-18
lines changed

container.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (c *container) Close() (err error) {
109109

110110
for i := len(closers) - 1; i >= 0; i-- {
111111
if err = closers[i](); err != nil {
112-
return fmt.Errorf("unable close container : %w", err)
112+
return fmt.Errorf("unable to close container : %w", err)
113113
}
114114
}
115115

@@ -126,20 +126,24 @@ func (c *container) Has(value Type, modifiers ...Modifier) bool {
126126
}
127127

128128
func (c *container) Resolve(target Value, modifiers ...Modifier) (err error) {
129-
var rv = reflect.ValueOf(target)
130-
131129
c.mux.Lock()
132-
err = c.resolve(&rv, cycle.New(), modifiers)
133-
c.mux.Unlock()
130+
defer c.mux.Unlock()
134131

135-
if err != nil {
132+
var rv = reflect.ValueOf(target)
133+
if err = c.resolve(&rv, cycle.New(), modifiers); err != nil {
136134
return fmt.Errorf("%s : %w", runtime.Caller(0), err)
137135
}
138136

139137
return nil
140138
}
141139

142140
func (c *container) resolve(tv *reflect.Value, cycle *cycle.Cycle, modifiers []Modifier) (err error) {
141+
defer func() {
142+
if recovered := recover(); recovered != nil {
143+
err = fmt.Errorf("unable to resolve target because the container panicked: %+v", recovered)
144+
}
145+
}()
146+
143147
if tv.Kind() != reflect.Pointer && tv.Kind() != reflect.Slice {
144148
if tv.IsValid() {
145149
return NewTypeError(tv.Type(), ErrMustBeSliceOrPointer)
@@ -237,9 +241,15 @@ func (c *container) resolveDependency(cycle *cycle.Cycle, dep *compiler.Dependen
237241
func (c *container) set(tv *reflect.Value, sv reflect.Value) {
238242
switch tv.Elem().Kind() {
239243
case reflect.Slice:
240-
tv.Elem().Set(
241-
reflect.Append(tv.Elem(), sv),
242-
)
244+
if sv.Kind() == reflect.Slice {
245+
tv.Elem().Set(
246+
reflect.AppendSlice(tv.Elem(), sv),
247+
)
248+
} else {
249+
tv.Elem().Set(
250+
reflect.Append(tv.Elem(), sv),
251+
)
252+
}
243253
default:
244254
tv.Elem().Set(sv)
245255
}

container_test.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ func NewContainer() (di.Container, error) {
4747
}, {
4848
Name: "flaky",
4949
}}),
50+
51+
di.Provide(NewSlice1),
52+
di.Provide(NewSlice2),
53+
di.Provide(NewNamedSlice),
5054
)
5155

5256
if err != nil {
@@ -68,7 +72,6 @@ func TestContainer(t *testing.T) {
6872
var err = ctn.Call(nil)
6973
require.Error(t, err)
7074
require.ErrorIs(t, err, di.ErrorMustBeFunction)
71-
require.ErrorContains(t, err, "container_test.go:68")
7275
},
7376
}, {
7477
Name: "Call with unregistered type",
@@ -79,7 +82,6 @@ func TestContainer(t *testing.T) {
7982

8083
require.Error(t, err)
8184
require.ErrorIs(t, err, di.ErrDoesNotExist)
82-
require.ErrorContains(t, err, "container_test.go:76")
8385
},
8486
}, {
8587
Name: "Call without dependencies",
@@ -156,6 +158,17 @@ func TestContainer(t *testing.T) {
156158
require.NoError(t, err)
157159
},
158160
}, {
161+
Name: "Call with collections",
162+
Run: func(t *testing.T, ctn di.Container) {
163+
var err = ctn.Call(func(s1 Items, s2 []Item, s3 ...Item) {
164+
require.ElementsMatch(t, s1, Items{1, 2, 3})
165+
require.ElementsMatch(t, s2, Items{4, 5, 6, 7})
166+
require.ElementsMatch(t, s3, Items{4, 5, 6, 7})
167+
})
168+
169+
require.NoError(t, err)
170+
},
171+
}, {
159172
Name: "Call func with error",
160173
Run: func(t *testing.T, ctn di.Container) {
161174
var eErr = errors.New("expected")
@@ -165,7 +178,6 @@ func TestContainer(t *testing.T) {
165178
})
166179

167180
require.ErrorIs(t, aErr, eErr)
168-
require.ErrorContains(t, aErr, "container_test.go:162")
169181
},
170182
}, {
171183
Name: "Has dependency exist",
@@ -183,7 +195,6 @@ func TestContainer(t *testing.T) {
183195
var err = ctn.Resolve(nil)
184196
require.Error(t, err)
185197
require.ErrorIs(t, err, di.ErrMustBeSliceOrPointer)
186-
require.ErrorContains(t, err, "container_test.go:183")
187198
},
188199
}, {
189200
Name: "Resolve multiple error",
@@ -196,7 +207,6 @@ func TestContainer(t *testing.T) {
196207
require.Nil(t, foo)
197208
require.Error(t, err)
198209
require.ErrorIs(t, err, di.ErrMultipleDefinitions)
199-
require.ErrorContains(t, err, "container_test.go:193")
200210
},
201211
}, {
202212
Name: "Resolve flaky dependency",
@@ -208,7 +218,6 @@ func TestContainer(t *testing.T) {
208218

209219
require.Nil(t, flaky)
210220
require.Error(t, err)
211-
require.ErrorContains(t, err, "container_test.go:206")
212221
},
213222
}, {
214223
Name: "Resolve cycled",
@@ -220,7 +229,6 @@ func TestContainer(t *testing.T) {
220229

221230
require.Nil(t, srv)
222231
require.ErrorIs(t, err, cycle.ErrCycleDetected)
223-
require.ErrorContains(t, err, "container_test.go:218")
224232
},
225233
}, {
226234
Name: "Resolved group with flaky item",
@@ -230,7 +238,6 @@ func TestContainer(t *testing.T) {
230238
}, di.Constraint(([]Controller)(nil)))
231239

232240
require.Error(t, err)
233-
require.ErrorContains(t, err, "container_test.go:228")
234241
},
235242
}, {
236243
Name: "Resolve without dependencies",

di_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ type (
3030
FlakyController struct {
3131
_ int
3232
}
33+
34+
Item int
35+
36+
Items []Item
3337
)
3438

3539
func (c *BarController) Register(srv *http.ServeMux) {
@@ -89,3 +93,15 @@ func NewFlakyController() (*FlakyController, error) {
8993
func NewCycledController(cycled *CycledController) *CycledController {
9094
return cycled
9195
}
96+
97+
func NewSlice1() []Item {
98+
return []Item{4, 5}
99+
}
100+
101+
func NewSlice2() []Item {
102+
return []Item{6, 7}
103+
}
104+
105+
func NewNamedSlice() Items {
106+
return Items{1, 2, 3}
107+
}

internal/compiler/constructor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func (c *Constructor) Type() reflect.Type {
115115
func (c *Constructor) call(args []reflect.Value) (_ []reflect.Value, err error) {
116116
defer func() {
117117
if recovered := recover(); recovered != nil {
118-
err = fmt.Errorf("unable create because the constructor %w : %+v", ErrPanicked, recovered)
118+
err = fmt.Errorf("unable to create because the constructor %w : %+v", ErrPanicked, recovered)
119119
}
120120
}()
121121

0 commit comments

Comments
 (0)