Source File
extract.go
Belonging Package
go.uber.org/fx
// Copyright (c) 2019 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 ()var _typeOfIn = reflect.TypeOf(In{})// Extract fills the given struct with values from the dependency injection// container on application initialization. The target MUST be a pointer to a// struct. Only exported fields will be filled.//// Deprecated: Use Populate instead.func ( interface{}) Option {:= reflect.ValueOf()if := .Type(); .Kind() != reflect.Ptr || .Elem().Kind() != reflect.Struct {return Error(fmt.Errorf("Extract expected a pointer to a struct, got a %v", ))}= .Elem():= .Type()// We generate a function which accepts a single fx.In struct as an// argument. This struct contains all exported fields of the target// struct.// Fields of the generated fx.In struct.:= make([]reflect.StructField, 0, .NumField()+1)// Anonymous dig.In field.= append(, reflect.StructField{Name: _typeOfIn.Name(),Anonymous: true,Type: _typeOfIn,})// List of values in the target struct aligned with the fields of the// generated struct.//// So for example, if the target is,//// var target struct {// Foo io.Reader// bar []byte// Baz io.Writer// }//// The generated struct has the shape,//// struct {// fx.In//// F0 io.Reader// F2 io.Writer// }//// And `targets` is,//// [// target.Field(0), // Foo io.Reader// target.Field(2), // Baz io.Writer// ]//// As we iterate through the fields of the generated struct, we can copy// the value into the corresponding value in the targets list.:= make([]reflect.Value, 0, .NumField())for := 0; < .NumField(); ++ {:= .Field()// Skip unexported fields.if .Anonymous {// If embedded, StructField.PkgPath is not a reliable indicator of// whether the field is exported. See// https://github.com/golang/go/issues/21122:= .Typeif .Kind() == reflect.Ptr {= .Elem()}if !isExported(.Name()) {continue}} else if .PkgPath != "" {continue}// We don't copy over names or embedded semantics.= append(, reflect.StructField{Name: fmt.Sprintf("F%d", ),Type: .Type,Tag: .Tag,})= append(, .Field())}// Equivalent to,//// func(r struct {// fx.In//// F1 Foo// F2 Bar// }) {// target.Foo = r.F1// target.Bar = r.F2// }:= reflect.MakeFunc(reflect.FuncOf([]reflect.Type{reflect.StructOf()},nil, /* results */false, /* variadic */),func( []reflect.Value) []reflect.Value {:= [0]for := 1; < .NumField(); ++ {[-1].Set(.Field())}return nil},)return Invoke(.Interface())}// isExported reports whether the identifier is exported.func isExported( string) bool {, := utf8.DecodeRuneInString()return unicode.IsUpper()}
![]() |
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. |