goose: add interface binding
An interface binding instructs goose that a concrete type should be used to satisfy a dependency on an interface type. goose could determine this implicitly, but having an explicit directive makes the provider author's intent clear and allows different concrete types to satisfy different smaller interfaces. Reviewed-by: Tuo Shan <shantuo@google.com>
This commit is contained in:
50
internal/goose/testdata/InterfaceBindingReuse/foo/foo.go
vendored
Normal file
50
internal/goose/testdata/InterfaceBindingReuse/foo/foo.go
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
// This test verifies that the concrete type is provided only once, even if an
|
||||
// interface additionally depends on it.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func main() {
|
||||
injectFooBar()
|
||||
fmt.Println(provideBarCalls)
|
||||
}
|
||||
|
||||
type Fooer interface {
|
||||
Foo() string
|
||||
}
|
||||
|
||||
type Bar string
|
||||
|
||||
type FooBar struct {
|
||||
Fooer Fooer
|
||||
Bar *Bar
|
||||
}
|
||||
|
||||
func (b *Bar) Foo() string {
|
||||
return string(*b)
|
||||
}
|
||||
|
||||
//goose:provide
|
||||
//goose:bind provideBar Fooer *Bar
|
||||
func provideBar() *Bar {
|
||||
mu.Lock()
|
||||
provideBarCalls++
|
||||
mu.Unlock()
|
||||
b := new(Bar)
|
||||
*b = "Hello, World!"
|
||||
return b
|
||||
}
|
||||
|
||||
var (
|
||||
mu sync.Mutex
|
||||
provideBarCalls int
|
||||
)
|
||||
|
||||
//goose:provide
|
||||
func provideFooBar(fooer Fooer, bar *Bar) FooBar {
|
||||
return FooBar{fooer, bar}
|
||||
}
|
||||
Reference in New Issue
Block a user