go-kod / kod

A generics based dependency injection application framework for Go, support OpenTelemetry trace/metric/log natively 🚀🚀🚀
https://pkg.go.dev/github.com/go-kod/kod
Apache License 2.0
109 stars 3 forks source link

component was not registered #167

Closed leopku closed 1 month ago

leopku commented 1 month ago
package db

import (
    "context"
    "database/sql"

    "github.com/go-kod/kod"
    "github.com/go-kod/kod/ext/client/ksql"
)

type DBComponent struct {
    kod.Implements[Component]
    kod.WithConfig[config]

    db *sql.DB
}

type config struct {
    DbConfig ksql.Config
}

func (ins *DBComponent) Init(ctx context.Context) error {
    ins.db = ins.Config().DbConfig.Build()
    return nil
}
type demoImpl struct {
    kod.Implements[kod.Main]
    db kod.Ref[db.DBComponent]
}

func main() {
        fmt.Println("demo called")
        kod.Run(context.Background(), func(ctx context.Context, impl *demoImpl) error {
            dbIns := impl.db.Get()
            impl.L(ctx).Info(dbIns.Config().DbConfig.DriverName)
            return nil
        })
}
kod struct2interface ./...
kod generate ./...
Error: component implementation struct cmd.demoImpl has field kod.Ref[github.com/leopku/emeraldpanel/pkg/infra/db.DBComponent], but component db.DBComponent was not registered; maybe you forgot to run 'kod generate'

Any advice?

sysulq commented 1 month ago

Please check if pkg/infra/db/kod_gen.go generated?

Maybe you could also try run kod generate -s ./... instead.

leopku commented 1 month ago

same issue after running kod generate -s ./....

package db

import ( "context" "github.com/go-kod/kod" "github.com/go-kod/kod/interceptor" "reflect" )

func init() { kod.Register(&kod.Registration{ Name: "wdwow.eu.org/leo/emeraldpanel/pkg/infra/db/Component", Interface: reflect.TypeOf((Component)(nil)).Elem(), Impl: reflect.TypeOf(DBComponent{}), Refs: ``, LocalStubFn: func(ctx context.Context, info kod.LocalStubFnInfo) any { interceptors := info.Interceptors if h, ok := info.Impl.(interface { Interceptors() []interceptor.Interceptor }); ok { interceptors = append(interceptors, h.Interceptors()...) }

        return component_local_stub{
            impl:        info.Impl.(Component),
            interceptor: interceptor.Chain(interceptors),
            name:        info.Name,
        }
    },
})

}

// kod.InstanceOf checks. var _ kod.InstanceOf[Component] = (*DBComponent)(nil)

// Local stub implementations.

type component_local_stub struct { impl Component name string interceptor interceptor.Interceptor }

// Check that component_localstub implements the Component interface. var Component = (*component_local_stub)(nil)

sysulq commented 1 month ago

kod.Ref only supports interface, instead of struct 😀

sysulq commented 1 month ago

Change db.DBComponent to db.Component would fix it.