Skip to content

Commit e948f8a

Browse files
authored
Merge pull request #72 from gone-io/feature/loader
Rewrite core with new architecture Supports injected name with wildcards Add more test cases, 100% coverage
2 parents 6ceaa62 + b5d7d10 commit e948f8a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+4222
-3718
lines changed

application.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
type Application struct {
1010
Flag
1111

12-
loader *Core `gone:"*"`
12+
loader *core `gone:"*"`
1313
daemons []Daemon `gone:"*"`
1414

1515
beforeStartHooks []Process
@@ -45,7 +45,7 @@ func Prepare(loads ...LoadFunc) *Application {
4545

4646
func (s *Application) init() *Application {
4747
s.signal = make(chan os.Signal, 1)
48-
s.loader = NewCore()
48+
s.loader = newCore()
4949

5050
s.
5151
Load(s, IsDefault()).
@@ -236,8 +236,8 @@ func (s *Application) Run(fn ...any) {
236236
s.stop()
237237
}
238238

239-
func Run(fn any) {
240-
Default.Run(fn)
239+
func Run(fn ...any) {
240+
Default.Run(fn...)
241241
}
242242

243243
// Serve initializes the application, starts all daemons, and waits for termination signal.

application_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,3 +544,17 @@ func TestMustLoadPanic(t *testing.T) {
544544
t.Errorf("Expected duplicate name error, got %s", err.Error())
545545
}
546546
}
547+
548+
func TestPrepare(t *testing.T) {
549+
gone.Prepare().Run()
550+
}
551+
552+
func TestEnd(t *testing.T) {
553+
gone.
554+
Default.
555+
AfterStart(func() {
556+
time.Sleep(1 * time.Millisecond)
557+
gone.End()
558+
}).
559+
Serve()
560+
}

codecov.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ignore:
2+
- "**/*_mock.go"
3+
- "*_mock.go"

coffin.go

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gone
22

33
import (
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

2528
func 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

49103
func (c *coffin) isDefault(t reflect.Type) bool {

0 commit comments

Comments
 (0)