Files
wire/internal/goose/testdata/InterfaceBindingReuse/foo/foo.go
Ross Light 1380f96c06 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>
2018-11-12 14:09:56 -08:00

51 lines
705 B
Go

// 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}
}