This repository has been archived by the owner on Oct 14, 2022. It is now read-only.
/
provide_info.go
118 lines (107 loc) · 2.98 KB
/
provide_info.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package internal
import (
"fmt"
"reflect"
"strings"
"unsafe"
"go.uber.org/dig"
)
type ProvideInfosWrapper struct {
dig.ProvideInfo
exportedOutputs []ProvideOutput
exportedInputs []ProvideInput
}
func EnsureValueExported(value reflect.Value) reflect.Value {
if !value.CanSet() {
return reflect.NewAt(value.Type(), unsafe.Pointer(value.UnsafeAddr())).Elem()
} else {
return value
}
}
func (piw *ProvideInfosWrapper) ExportedOutputs() []ProvideOutput {
if piw.exportedOutputs != nil {
return piw.exportedOutputs
}
result := make([]ProvideOutput, 0, len(piw.Outputs))
for _, output := range piw.Outputs {
outputValue := reflect.ValueOf(output).Elem()
result = append(result, ProvideOutput{
Type: EnsureValueExported(outputValue.FieldByName("t")).Interface().(reflect.Type),
Name: EnsureValueExported(outputValue.FieldByName("name")).Interface().(string),
Group: EnsureValueExported(outputValue.FieldByName("group")).Interface().(string),
})
}
piw.exportedOutputs = result
return result
}
func (piw *ProvideInfosWrapper) ExportedInputs() []ProvideInput {
if piw.exportedInputs != nil {
return piw.exportedInputs
}
result := make([]ProvideInput, 0, len(piw.Inputs))
for _, input := range piw.Inputs {
inputValue := reflect.ValueOf(input).Elem()
result = append(result, ProvideInput{
Type: EnsureValueExported(inputValue.FieldByName("t")).Interface().(reflect.Type),
Optional: EnsureValueExported(inputValue.FieldByName("optional")).Interface().(bool),
Name: EnsureValueExported(inputValue.FieldByName("name")).Interface().(string),
Group: EnsureValueExported(inputValue.FieldByName("group")).Interface().(string),
})
}
piw.exportedInputs = result
return result
}
type ProvideOutput struct {
Type reflect.Type
Name, Group string
}
func (po *ProvideOutput) String() string {
if po.Name == "" && po.Group == "" {
return po.Type.String()
} else {
s := []string{}
if po.Name != "" {
s = append(s, fmt.Sprintf("name=\"%s\"", po.Name))
}
if po.Group != "" {
s = append(s, fmt.Sprintf("group=\"%s\"", po.Group))
}
return fmt.Sprintf("%s[%s]", po.Type.String(), strings.Join(s, ","))
}
}
func EqualsProvideOutputs(a []ProvideOutput, b []ProvideOutput) bool {
if len(a) != len(b) {
return false
}
am := make(map[ProvideOutput]struct{}, len(a))
bm := make(map[ProvideOutput]struct{}, len(a))
for _, o := range a {
am[o] = struct{}{}
}
for _, o := range b {
bm[o] = struct{}{}
}
return reflect.DeepEqual(am, bm)
}
type ProvideInput struct {
Type reflect.Type
Optional bool
Name, Group string
}
func (po *ProvideInput) String() string {
if po.Name == "" && po.Group == "" {
return po.Type.String()
} else {
s := []string{}
if po.Name != "" {
s = append(s, fmt.Sprintf("name=\"%s\"", po.Name))
}
if po.Group != "" {
s = append(s, fmt.Sprintf("group=\"%s\"", po.Group))
}
if po.Optional {
s = append(s, "optional")
}
return fmt.Sprintf("%s[%s]", po.Type.String(), strings.Join(s, ","))
}
}