wire icon indicating copy to clipboard operation
wire copied to clipboard

wire.NewSet support generics

Open OldSmokeGun opened this issue 2 years ago • 1 comments

Describe the bug

Wire doesn't support generics when I pass a generic function in wire.NewSet

To Reproduce

Pass generic function in wire.NewSet, like this:

wire.NewSet(
	db.New[config.DBConfigDefault, config.DBInstanceDefault],
	ent.New,
	redis.New,
	discovery.New,
	casbin.New,
	grpc.New,
	uid.New,
)

or

var ProviderSet = wire.NewSet(
	GetApp,
	GetHTTP,
	GetGRPC,
	GetDB[DBKeyDefault, DBConfigDefault],
	GetRedis,
	GetTrace,
	GetDiscovery,
	GetServices,
	GetJWT,
	GetCasbin,
)

Then, wire reports an error like this:

$ wire
wire: /example/internal/config/config.go:16:2: unknown pattern
wire: /example/internal/app/app.go:27:3: unknown pattern
wire: /example/internal/config/config.go:16:2: unknown pattern
wire: /example/internal/app/app.go:27:3: unknown pattern
wire: /example/internal/app/app.go:27:3: unknown pattern
wire: /example/internal/command: generate failed
wire: at least one generate failure

Expected behavior

can generate code correctly

Version

github.com/google/wire v0.5.1-0.20220620021424-0675cdc9191c

Additional context

Here is my code:

func GetDB[K DBKeyGetter, V DBConfigGroup]() (V, error) {
	c, err := getEntry(config.DB)
	if err != nil {
		return V{}, err
	}
	var k K
	return V(c[k.GetName()]), nil
}
func New[C config.DBConfigGroup, D config.DBInstanceGroup](conf C, logger *slog.Logger) (db D, cleanup func(), err error) {
        // code
}

OldSmokeGun avatar Mar 14 '23 18:03 OldSmokeGun

You can use workaround like this

wire.NewSet(
	newDb,
	ent.New,
	redis.New,
	discovery.New,
	casbin.New,
	grpc.New,
	uid.New,
)

func newDb(conf config.DBConfigDefault, logger *slog.Logger) (db config.DBInstanceDefault, cleanup func(), err error) {
	return db.New[config.DBConfigDefault, config.DBInstanceDefault]
}

Hamper avatar Apr 03 '24 12:04 Hamper