Skip to content

Commit 59acf30

Browse files
committed
feat: improve errors messages
1 parent be00827 commit 59acf30

File tree

4 files changed

+17
-15
lines changed

4 files changed

+17
-15
lines changed

di.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ func InvokeStruct[T any](i Injector) (*T, error) {
146146
return nil, fmt.Errorf("DI: not a struct")
147147
}
148148

149-
err := invokeByTags(i, value)
149+
structName := inferServiceName[T]()
150+
151+
err := invokeByTags(i, structName, value)
150152
if err != nil {
151153
return nil, err
152154
}

di_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ func TestInvokeStruct(t *testing.T) {
602602
EagerTest *int `do:"*github.com/samber/do/v2.eagerTest"`
603603
}
604604
test7, err := InvokeStruct[namedDependencyButTypeMismatch](i)
605-
is.Equal("DI: field 'EagerTest' is not assignable to service *github.com/samber/do/v2.eagerTest", err.Error())
605+
is.Equal("DI: field `github.com/samber/do/v2.namedDependencyButTypeMismatch.EagerTest` is not assignable to service *github.com/samber/do/v2.eagerTest", err.Error())
606606
is.Nil(test7)
607607

608608
// use a custom tag

invoke.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func invokeByGenericType[T any](i Injector) (T, error) {
165165
}
166166

167167
// invokeByTag looks for a service by its tag.
168-
func invokeByTags(i Injector, structValue reflect.Value) error {
168+
func invokeByTags(i Injector, structName string, structValue reflect.Value) error {
169169
injector := getInjectorOrDefault(i)
170170

171171
// Ensure that servicePtr is a pointer to a struct
@@ -186,7 +186,7 @@ func invokeByTags(i Injector, structValue reflect.Value) error {
186186
}
187187

188188
if !fieldValue.CanAddr() {
189-
return fmt.Errorf("DI: field is not addressable %s", field.Name)
189+
return fmt.Errorf("DI: field is not addressable `%s.%s`", structName, field.Name)
190190
}
191191

192192
if !fieldValue.CanSet() {
@@ -208,7 +208,7 @@ func invokeByTags(i Injector, structValue reflect.Value) error {
208208

209209
// Should be check before invocation, because we just built something that is not assignable to the field.
210210
if !fieldValue.Type().AssignableTo(dependencyValue.Type()) {
211-
return fmt.Errorf("DI: field '%s' is not assignable to service %s", field.Name, serviceName)
211+
return fmt.Errorf("DI: field `%s.%s` is not assignable to service %s", structName, field.Name, serviceName)
212212
}
213213

214214
// Should not panic, since we checked CanAddr() and CanSet() earlier.

invoke_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,19 +243,19 @@ func TestInvokeByTags(t *testing.T) {
243243
ProvideValue(i, &eagerTest{foobar: "foobar"})
244244

245245
// no dependencies
246-
err := invokeByTags(i, reflect.ValueOf(&eagerTest{}))
246+
err := invokeByTags(i, "*myStruct", reflect.ValueOf(&eagerTest{}))
247247
is.Nil(err)
248248

249249
// not pointer
250-
err = invokeByTags(i, reflect.ValueOf(eagerTest{}))
250+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(eagerTest{}))
251251
is.Equal("DI: not a pointer", err.Error())
252252

253253
// exported field - generic type
254254
type hasExportedEagerTestDependency struct {
255255
EagerTest *eagerTest `do:""`
256256
}
257257
test1 := hasExportedEagerTestDependency{}
258-
err = invokeByTags(i, reflect.ValueOf(&test1))
258+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test1))
259259
is.Nil(err)
260260
is.Equal("foobar", test1.EagerTest.foobar)
261261

@@ -264,7 +264,7 @@ func TestInvokeByTags(t *testing.T) {
264264
eagerTest *eagerTest `do:""`
265265
}
266266
test2 := hasNonExportedEagerTestDependency{}
267-
err = invokeByTags(i, reflect.ValueOf(&test2))
267+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test2))
268268
is.Nil(err)
269269
is.Equal("foobar", test2.eagerTest.foobar)
270270

@@ -273,15 +273,15 @@ func TestInvokeByTags(t *testing.T) {
273273
eagerTest *hasNonExportedEagerTestDependency `do:""` //nolint:unused
274274
}
275275
test3 := dependencyNotFound{}
276-
err = invokeByTags(i, reflect.ValueOf(&test3))
276+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test3))
277277
is.Equal(serviceNotFound(i, []string{inferServiceName[*hasNonExportedEagerTestDependency]()}).Error(), err.Error())
278278

279279
// use tag
280280
type namedDependency struct {
281281
eagerTest *eagerTest `do:"int"` //nolint:unused
282282
}
283283
test4 := namedDependency{}
284-
err = invokeByTags(i, reflect.ValueOf(&test4))
284+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test4))
285285
is.Equal(serviceNotFound(i, []string{inferServiceName[int]()}).Error(), err.Error())
286286

287287
// named service
@@ -290,7 +290,7 @@ func TestInvokeByTags(t *testing.T) {
290290
EagerTest int `do:"foobar"`
291291
}
292292
test5 := namedService{}
293-
err = invokeByTags(i, reflect.ValueOf(&test5))
293+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test5))
294294
is.Nil(err)
295295
is.Equal(42, test5.EagerTest)
296296

@@ -299,8 +299,8 @@ func TestInvokeByTags(t *testing.T) {
299299
EagerTest *int `do:"*github.com/samber/do/v2.eagerTest"`
300300
}
301301
test6 := namedDependencyButTypeMismatch{}
302-
err = invokeByTags(i, reflect.ValueOf(&test6))
303-
is.Equal("DI: field 'EagerTest' is not assignable to service *github.com/samber/do/v2.eagerTest", err.Error())
302+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test6))
303+
is.Equal("DI: field `*myStruct.EagerTest` is not assignable to service *github.com/samber/do/v2.eagerTest", err.Error())
304304

305305
// use a custom tag
306306
i = NewWithOpts(&InjectorOpts{StructTagKey: "hello"})
@@ -309,7 +309,7 @@ func TestInvokeByTags(t *testing.T) {
309309
EagerTest int `hello:"foobar"`
310310
}
311311
test7 := namedServiceWithCustomTag{}
312-
err = invokeByTags(i, reflect.ValueOf(&test7))
312+
err = invokeByTags(i, "*myStruct", reflect.ValueOf(&test7))
313313
is.Nil(err)
314314
is.Equal(42, test7.EagerTest)
315315
}

0 commit comments

Comments
 (0)