11package gone
22
33import (
4+ "fmt"
45 "reflect"
56 "sort"
67)
@@ -14,36 +15,89 @@ type coffin struct {
1415 onlyForName bool
1516 forceReplace bool
1617
17- defaultTypeMap map [reflect.Type ]bool
18- lazyFill bool
19- needInitBeforeUse bool
20- isFill bool
21- isInit bool
22- provider * wrapProvider
18+ defaultTypeMap map [reflect.Type ]bool
19+ lazyFill bool
20+ needInitBeforeUse bool
21+ isFill bool
22+ isInit bool
23+ provider * wrapProvider
24+ namedProvider NamedProvider
25+ structFieldInjector StructFieldInjector
2326}
2427
2528func newCoffin (goner any ) * coffin {
26- _ , needInitBeforeUse := goner .( Initiator )
27- if ! needInitBeforeUse {
28- _ , needInitBeforeUse = goner .( InitiatorNoError )
29+ co := & coffin {
30+ goner : goner ,
31+ defaultTypeMap : make ( map [reflect. Type ] bool ),
2932 }
30- provider := tryWrapGonerToProvider (goner )
31- if provider != nil {
32- needInitBeforeUse = true
33+
34+ if namedGoner , ok := goner .(NamedGoner ); ok {
35+ co .name = namedGoner .GonerName ()
36+ }
37+
38+ if namedProvider , ok := goner .(NamedProvider ); ok {
39+ co .needInitBeforeUse = true
40+ co .namedProvider = namedProvider
41+ } else if provider := tryWrapGonerToProvider (goner ); provider != nil {
42+ co .needInitBeforeUse = true
43+ co .provider = provider
44+ //co.defaultTypeMap[provider.Type()] = true
45+ } else if _ , ok := goner .(Initiator ); ok {
46+ co .needInitBeforeUse = true
47+ } else if _ , ok := goner .(InitiatorNoError ); ok {
48+ co .needInitBeforeUse = true
49+ } else if _ , ok := goner .(StructFieldInjector ); ok {
50+ co .needInitBeforeUse = true
51+ }
52+
53+ return co
54+ }
55+
56+ func (c * coffin ) Name () string {
57+ if c .name != "" {
58+ return fmt .Sprintf ("Goner(name=%s)" , c .name )
59+ }
60+ return fmt .Sprintf ("%T" , c .goner )
61+ }
62+
63+ func (c * coffin ) CoundProvide (t reflect.Type , byName bool ) error {
64+ if IsCompatible (t , c .goner ) {
65+ return nil
66+ }
67+
68+ if c .provider != nil && c .provider .ProvideTypeCompatible (t ) {
69+ return nil
3370 }
34- if ! needInitBeforeUse {
35- _ , needInitBeforeUse = goner .(NamedProvider )
71+
72+ if c .namedProvider != nil && (byName || c .isDefault (t )) {
73+ return nil
3674 }
37- if ! needInitBeforeUse {
38- _ , needInitBeforeUse = goner .(StructFieldInjector )
75+
76+ return NewInnerErrorWithParams (GonerTypeNotMatch , "%q cannot provide %q value" , c .Name (), GetTypeName (t ))
77+ }
78+
79+ func (c * coffin ) AddToDefault (t reflect.Type ) error {
80+ if err := c .CoundProvide (t , true ); err != nil {
81+ return err
3982 }
83+ c .defaultTypeMap [t ] = true
84+ return nil
85+ }
4086
41- return & coffin {
42- goner : goner ,
43- defaultTypeMap : make (map [reflect.Type ]bool ),
44- needInitBeforeUse : needInitBeforeUse ,
45- provider : provider ,
87+ func (c * coffin ) Provide (byName bool , tagConf string , t reflect.Type ) (any , error ) {
88+ if IsCompatible (t , c .goner ) {
89+ return c .goner , nil
4690 }
91+
92+ if c .provider != nil && c .provider .ProvideTypeCompatible (t ) {
93+ return c .provider .Provide (tagConf )
94+ }
95+
96+ if c .namedProvider != nil && (byName || c .isDefault (t )) {
97+ return c .namedProvider .Provide (tagConf , t )
98+ }
99+
100+ return nil , NewInnerErrorWithParams (NotSupport , "gone: %s cannot provide %s value" , c .Name (), GetTypeName (t ))
47101}
48102
49103func (c * coffin ) isDefault (t reflect.Type ) bool {
0 commit comments