Adds Context.BindToProvider (#201)

This commit is contained in:
Stan Rozenraukh
2021-08-30 16:47:02 -04:00
committed by GitHub
parent d0c0180cec
commit 74cb5130e3
3 changed files with 37 additions and 20 deletions
+26
View File
@@ -4,6 +4,8 @@ import (
"fmt"
"reflect"
"strings"
"github.com/pkg/errors"
)
type bindings map[reflect.Type]func() (reflect.Value, error)
@@ -24,6 +26,30 @@ func (b bindings) add(values ...interface{}) bindings {
return b
}
func (b bindings) addTo(impl, iface interface{}) {
valueOf := reflect.ValueOf(impl)
b[reflect.TypeOf(iface).Elem()] = func() (reflect.Value, error) { return valueOf, nil }
}
func (b bindings) addProvider(provider interface{}) error {
pv := reflect.ValueOf(provider)
t := pv.Type()
if t.Kind() != reflect.Func || t.NumIn() != 0 || t.NumOut() != 2 || t.Out(1) != reflect.TypeOf((*error)(nil)).Elem() {
return errors.Errorf("%T must be a function with the signature func()(T, error)", provider)
}
rt := pv.Type().Out(0)
b[rt] = func() (reflect.Value, error) {
out := pv.Call(nil)
errv := out[1]
var err error
if !errv.IsNil() {
err = errv.Interface().(error) // nolint
}
return out[0], err
}
return nil
}
// Clone and add values.
func (b bindings) clone() bindings {
out := make(bindings, len(b))