Skip to content

Commit c0a0c9e

Browse files
committed
refactor: interceptor logic
1 parent 09235f6 commit c0a0c9e

File tree

10 files changed

+95
-355
lines changed

10 files changed

+95
-355
lines changed

cmd/kod/internal/generate_generator.go

+8-12
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,11 @@ func (c *component) fullIntfName() string {
411411
return fullName(c.intf)
412412
}
413413

414+
// fullIntfName returns the full package-prefixed component interface name.
415+
func (c *component) fullFullMethodName(methodName string) string {
416+
return c.fullIntfName() + "." + methodName
417+
}
418+
414419
// methods returns the component interface's methods.
415420
func (c *component) methods() []*types.Func {
416421
underlying := c.intf.Underlying().(*types.Interface)
@@ -660,7 +665,7 @@ func (g *generator) generateFullMethodNames(p printFn) {
660665
for _, comp := range g.components {
661666
for _, m := range comp.methods() {
662667
p(`// %s is the full name of the method [%s.%s].`, comp.fullMethodNameVar(m.Name()), comp.implName(), m.Name())
663-
p(`%s = %q`, comp.fullMethodNameVar(m.Name()), comp.fullIntfName())
668+
p(`%s = %q`, comp.fullMethodNameVar(m.Name()), comp.fullFullMethodName(m.Name()))
664669
}
665670
}
666671
p(`)`)
@@ -692,24 +697,15 @@ func (g *generator) generateRegisteredComponents(p printFn) {
692697
for _, comp := range g.components {
693698
name := comp.intfName()
694699
myName := comp.fullIntfName()
695-
var inits strings.Builder
696-
697-
inits.Reset()
698700

699701
g.interceptor()
700702
localStubFn := fmt.Sprintf(`func(ctx context.Context, info *kod.LocalStubFnInfo) any {
701-
interceptors := info.Interceptors
702-
if h, ok := info.Impl.(interface{ Interceptors() []interceptor.Interceptor }); ok {
703-
interceptors = append(interceptors, h.Interceptors()...)
704-
}
705-
706-
%s
707703
return %s_local_stub{
708704
impl: info.Impl.(%s),
709-
interceptor: interceptor.Chain(interceptors),
705+
interceptor: info.Interceptor,
710706
name: info.Name,
711707
} }`,
712-
inits.String(), notExported(name), g.componentRef(comp))
708+
notExported(name), g.componentRef(comp))
713709
refNames := make([]string, 0, len(comp.refs))
714710
for _, ref := range comp.refs {
715711
refNames = append(refNames, callgraph.MakeEdgeString(comp.fullIntfName(), fullName(ref)))

examples/helloworld/kod_gen.go

+7-35
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/registry/registry.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99

1010
// LocalStubFnInfo is the information passed to LocalStubFn.
1111
type LocalStubFnInfo struct {
12-
Impl any
13-
Name string
14-
Interceptors []interceptor.Interceptor
12+
Impl any
13+
Name string
14+
Interceptor interceptor.Interceptor
1515
}
1616

1717
// Registration is the registration information for a component.

registry.go

+15-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/dominikbraun/graph"
1111

12+
"github.com/go-kod/kod/interceptor"
1213
"github.com/go-kod/kod/internal/callgraph"
1314
"github.com/go-kod/kod/internal/hooks"
1415
"github.com/go-kod/kod/internal/registry"
@@ -53,11 +54,20 @@ func (k *Kod) getIntf(ctx context.Context, t reflect.Type) (any, error) {
5354
return nil, err
5455
}
5556

56-
intf = reg.LocalStubFn(ctx, &LocalStubFnInfo{
57-
Name: reg.Name,
58-
Impl: comp,
59-
Interceptors: k.opts.interceptors,
60-
})
57+
interceptors := k.opts.interceptors
58+
if h, ok := comp.(interface {
59+
Interceptors() []interceptor.Interceptor
60+
}); ok {
61+
interceptors = append(interceptors, h.Interceptors()...)
62+
}
63+
64+
info := &LocalStubFnInfo{
65+
Name: reg.Name,
66+
Impl: comp,
67+
Interceptor: interceptor.Chain(interceptors),
68+
}
69+
70+
intf = reg.LocalStubFn(ctx, info)
6171

6272
k.components[reg.Name] = intf
6373

0 commit comments

Comments
 (0)