Source File
supply.go
Belonging Package
go.uber.org/fx
// Copyright (c) 2020 Uber Technologies, Inc.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to deal// in the Software without restriction, including without limitation the rights// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN// THE SOFTWARE.package fximport ()// Supply provides instantiated values for dependency injection as if// they had been provided using a constructor that simply returns them.// The most specific type of each value (as determined by reflection) is used.//// This serves a purpose similar to what fx.Replace does for fx.Decorate.//// For example, given://// type (// TypeA struct{}// TypeB struct{}// TypeC struct{}// )//// var a, b, c = &TypeA{}, TypeB{}, &TypeC{}//// The following two forms are equivalent://// fx.Supply(a, b, fx.Annotated{Target: c})//// fx.Provide(// func() *TypeA { return a },// func() TypeB { return b },// fx.Annotated{Target: func() *TypeC { return c }},// )//// Supply panics if a value (or annotation target) is an untyped nil or an error.//// [Private] can be used to restrict access to supplied values.//// # Supply Caveats//// As mentioned above, Supply uses the most specific type of the provided// value. For interface values, this refers to the type of the implementation,// not the interface. So if you supply an http.Handler, fx.Supply will use the// type of the implementation.//// var handler http.Handler = http.HandlerFunc(f)// fx.Supply(handler)//// Is equivalent to,//// fx.Provide(func() http.HandlerFunc { return f })//// This is typically NOT what you intended. To supply the handler above as an// http.Handler, we need to use the fx.Annotate function with the fx.As// annotation.//// fx.Supply(// fx.Annotate(handler, fx.As(new(http.Handler))),// )func ( ...interface{}) Option {:= make([]interface{}, 0, len()):= make([]reflect.Type, 0, len())var boolfor , := range {var (reflect.Typeany)switch value := .(type) {case privateOption:= truecontinuecase annotated:.Target, = newSupplyConstructor(.Target)=case Annotated:.Target, = newSupplyConstructor(.Target)=default:, = newSupplyConstructor()}= append(, )= append(, )}return supplyOption{Targets: ,Types: ,Stack: fxreflect.CallerStack(1, 0),Private: ,}}type supplyOption struct {Targets []interface{}Types []reflect.Type // type of value produced by constructor[i]Stack fxreflect.StackPrivate bool}func ( supplyOption) ( *module) {for , := range .Targets {.provides = append(.provides, provide{Target: ,Stack: .Stack,IsSupply: true,SupplyType: .Types[],Private: .Private,})}}func ( supplyOption) () string {:= make([]string, 0, len(.Targets))for , := range .Types {= append(, .String())}return fmt.Sprintf("fx.Supply(%s)", strings.Join(, ", "))}// Returns a function that takes no parameters, and returns the given value.func newSupplyConstructor( interface{}) (interface{}, reflect.Type) {switch .(type) {case nil:panic("untyped nil passed to fx.Supply")case error:panic("error value passed to fx.Supply")}:= reflect.TypeOf():= []reflect.Type{}:= []reflect.Value{reflect.ValueOf()}:= reflect.FuncOf([]reflect.Type{}, , false):= reflect.MakeFunc(, func([]reflect.Value) []reflect.Value {return})return .Interface(),}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |