Skip to content

Commit

Permalink
feat: fix gone.IsDefault error; check examples
Browse files Browse the repository at this point in the history
  • Loading branch information
dapeng committed Jun 15, 2024
1 parent 9e86da3 commit c0a5380
Show file tree
Hide file tree
Showing 63 changed files with 408 additions and 281 deletions.
98 changes: 52 additions & 46 deletions cemetery.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,32 +33,30 @@ func GetGoneDefaultId(goner Goner) GonerId {
}

func (c *cemetery) bury(goner Goner, options ...GonerOption) Tomb {
t := NewTomb(goner)
var id GonerId
theTomb := NewTomb(goner)

for _, option := range options {
switch option.(type) {
case GonerId:
id = option.(GonerId)
case IsDefault:
t.SetDefault(bool(option.(IsDefault)))
theTomb.SetId(option.(GonerId))
case defaultType:
theTomb.SetDefault(option.(defaultType).t)
case Order:
t.SetOrder(option.(Order))
theTomb.SetOrder(option.(Order))
}
}

if id == "" {
id = GetGoneDefaultId(goner)
if theTomb.GetId() == "" {
theTomb.SetId(GetGoneDefaultId(goner))
}

_, ok := c.tombMap[id]
_, ok := c.tombMap[theTomb.GetId()]
if ok {
panic(GonerIdIsExistedError(id))
panic(GonerIdIsExistedError(theTomb.GetId()))
}

c.tombMap[id] = t.SetId(id)
c.tombs = append(c.tombs, t)
return t
c.tombMap[theTomb.GetId()] = theTomb
c.tombs = append(c.tombs, theTomb)
return theTomb
}

func (c *cemetery) Bury(goner Goner, options ...GonerOption) Cemetery {
Expand All @@ -68,11 +66,12 @@ func (c *cemetery) Bury(goner Goner, options ...GonerOption) Cemetery {

func (c *cemetery) filterGonerIdFromOptions(options []GonerOption) GonerId {
var id GonerId

loop:
for _, option := range options {
switch option.(type) {
case GonerId:
id = option.(GonerId)
break loop
}
}
return id
Expand All @@ -91,17 +90,26 @@ func (c *cemetery) BuryOnce(goner Goner, options ...GonerOption) Cemetery {
}

func (c *cemetery) ReplaceBury(goner Goner, options ...GonerOption) (err error) {
var id = c.filterGonerIdFromOptions(options)
if id == "" {
newTomb := NewTomb(goner)

for _, option := range options {
switch option.(type) {
case GonerId:
newTomb.SetId(option.(GonerId))
case defaultType:
newTomb.SetDefault(option.(defaultType).t)
case Order:
newTomb.SetOrder(option.(Order))

Check warning on line 102 in cemetery.go

View check run for this annotation

Codecov / codecov/patch

cemetery.go#L99-L102

Added lines #L99 - L102 were not covered by tests
}
}
if newTomb.GetId() == "" {
err = ReplaceBuryIdParamEmptyError()
return
}

oldTomb := c.tombMap[id]
replaceTomb := NewTomb(goner).SetId(id)
c.tombMap[id] = replaceTomb
oldTomb, buried := c.tombMap[newTomb.GetId()]
c.tombMap[newTomb.GetId()] = newTomb

buried := oldTomb != nil
var oldGoner Goner
if buried {
oldGoner = oldTomb.GetGoner()
Expand All @@ -113,12 +121,12 @@ func (c *cemetery) ReplaceBury(goner Goner, options ...GonerOption) (err error)
}
}

c.tombs = append(c.tombs, replaceTomb)
_, err = c.reviveOneFromTomb(replaceTomb)
c.tombs = append(c.tombs, newTomb)
_, err = c.reviveOneFromTomb(newTomb)
if err != nil {
return err
}
return c.replaceTombsGonerField(id, goner, oldGoner, buried)
return c.replaceTombsGonerField(newTomb.GetId(), goner, oldGoner, buried)
}

func (c *cemetery) replaceTombsGonerField(id GonerId, newGoner, oldGoner Goner, buried bool) error {
Expand Down Expand Up @@ -252,7 +260,7 @@ func (c *cemetery) reviveSpecialTypeFields(field reflect.StructField, v reflect.
t := field.Type
switch t.Kind() {

case reflect.Slice: //允许注入接口切片
case reflect.Slice: //support inject slice
tombs := c.GetTomByType(t.Elem())
for _, tomb := range tombs {
if t.Elem().Kind() == reflect.Struct {
Expand All @@ -264,8 +272,8 @@ func (c *cemetery) reviveSpecialTypeFields(field reflect.StructField, v reflect.
}
suc = true

case reflect.Map: //允许注入接口Map
if t.Key().Kind() == reflect.String { //Map的key是string类型
case reflect.Map: //support inject map
if t.Key().Kind() == reflect.String { //key of map must be string
tombs := c.GetTomByType(t.Elem())

m := reflect.MakeMap(t)
Expand Down Expand Up @@ -346,29 +354,29 @@ func (c *cemetery) ReviveOne(goner any) (deps []Tomb, err error) {
v = BlackMagic(v)
}

//如果已经存在值,不再注入
//do not inject multiple times
if !v.IsZero() {
continue
}

var suc bool
var tmpDeps []Tomb

// 根据Id匹配
// inject by id
if tmpDeps, suc, err = c.reviveFieldById(tag, field, v); err != nil {
return
} else if suc {
deps = append(deps, tmpDeps...)
continue
}

// 根据类型匹配
// inject by type
if tmpDeps, suc = c.reviveFieldByType(field, v, goneTypeName); suc {
deps = append(deps, tmpDeps...)
continue
}

// 特殊类型处理
// inject special types
if tmpDeps, suc = c.reviveSpecialTypeFields(field, v); suc {
deps = append(deps, tmpDeps...)
continue
Expand Down Expand Up @@ -406,26 +414,24 @@ var obsessionType = reflect.TypeOf(obsessionPtr).Elem()
var obsessionPtr2 *Prophet2
var obsessionType2 = reflect.TypeOf(obsessionPtr2).Elem()

func (c *cemetery) prophesy() error {
var tombs = c.GetTomByType(obsessionType)
func (c *cemetery) prophesy() (err error) {
var tombs Tombs = c.GetTomByType(obsessionType)
tombs = append(tombs, c.GetTomByType(obsessionType2)...)
sort.Sort(tombs)

for _, tomb := range tombs {
obsession := tomb.GetGoner().(Prophet)
err := obsession.AfterRevive()
if err != nil {
return err
goner := tomb.GetGoner()
switch goner.(type) {
case Prophet:
err = goner.(Prophet).AfterRevive()
case Prophet2:
err = goner.(Prophet2).AfterRevive()
}
}

tombs = c.GetTomByType(obsessionType2)
for _, tomb := range tombs {
obsession := tomb.GetGoner().(Prophet2)
err := obsession.AfterRevive()
if err != nil {
return err
}
}

return nil
}

Expand All @@ -442,9 +448,9 @@ func (c *cemetery) getGonerContainerByType(t reflect.Type, name string) Tomb {
if len(tombs) > 0 {
var container Tomb

for _, t := range tombs {
if t.IsDefault() {
container = t
for _, tmp := range tombs {
if tmp.IsDefault(t) {
container = tmp
break
}
}
Expand Down
4 changes: 2 additions & 2 deletions error.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type defaultErr struct {
}

func (e *defaultErr) Error() string {
return fmt.Sprintf("GoneError(code=%v):%s", e.Code(), e.Msg())
return fmt.Sprintf("GoneError(code=%v); %s", e.Code(), e.Msg())
}

func (e *defaultErr) Msg() string {
Expand Down Expand Up @@ -96,7 +96,7 @@ type iError struct {

func (e *iError) Error() string {
msg := e.defaultErr.Error()
return fmt.Sprintf("%s\n%s", msg, e.trace)
return fmt.Sprintf("%s\n\n%s", msg, e.trace)
}

func (e *iError) Stack() []byte {
Expand Down
2 changes: 1 addition & 1 deletion error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func TestNewBusinessError(t *testing.T) {
assert.Equal(t, "error", businessError.Msg())
assert.Equal(t, 100, businessError.Code())
assert.Equal(t, data, businessError.Data())
assert.Equal(t, "GoneError(code=100):error", businessError.Error())
assert.Equal(t, "GoneError(code=100); error", businessError.Error())
}

func TestNewParameterError(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion example/after-revive/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func (c *Computer) Compute() {
println("1000 add 2000 is", c.adder.Add(1000, 2000))
}

// AfterRevive 复活后执行的函数
// AfterRevive will execute after revive
func (c *Computer) AfterRevive() gone.AfterReviveError {
// boot
c.Compute()
Expand Down
11 changes: 8 additions & 3 deletions example/app/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.21
toolchain go1.21.1

require (
github.com/gone-io/gone v0.0.0-20221018135039-2d9d20647331
github.com/gone-io/gone v1.0.2
github.com/stretchr/testify v1.9.0
)

Expand Down Expand Up @@ -55,18 +55,23 @@ require (
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
go.uber.org/mock v0.4.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/arch v0.7.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/sys v0.21.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.20.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect
google.golang.org/grpc v1.63.2 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect
xorm.io/xorm v1.3.2 // indirect
)

replace github.com/gone-io/gone v0.0.0-20221018135039-2d9d20647331 => ../../
replace github.com/gone-io/gone v1.0.2 => ../../
38 changes: 37 additions & 1 deletion example/gen-code/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,40 @@ module gen-code

go 1.21.1

require github.com/gone-io/gone v0.1.1
require github.com/gone-io/gone v1.0.2

require (
github.com/bytedance/sonic v1.10.2 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.17.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/leodido/go-urn v1.3.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/soheilhy/cmux v0.1.5 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.7.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sys v0.21.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect
xorm.io/xorm v1.3.2 // indirect
)

replace github.com/gone-io/gone v1.0.2 => ../../
2 changes: 1 addition & 1 deletion example/gen-code/goner.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func (c *Computer) Compute() {
println("1000 add 2000 is", c.adder.Add(1000, 2000))
}

// AfterRevive 复活后执行的函数
// AfterRevive will execute after revive
func (c *Computer) AfterRevive() gone.AfterReviveError {
// boot
c.Compute()
Expand Down
24 changes: 11 additions & 13 deletions example/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,47 @@ module example
go 1.21.1

require (
github.com/gone-io/gone v0.3.1
github.com/golang/mock v1.6.0
github.com/gone-io/gone v1.0.2
github.com/stretchr/testify v1.9.0
)

require (
github.com/bytedance/sonic v1.10.2 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.17.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gopherjs/gopherjs v1.17.2 // indirect
github.com/google/go-cmp v0.5.6 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/jtolds/gls v4.20.0+incompatible // indirect
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/leodido/go-urn v1.3.0 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/soheilhy/cmux v0.1.5 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.7.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/sys v0.21.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.20.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect
xorm.io/xorm v1.3.2 // indirect
)

replace github.com/gone-io/gone v1.0.2 => ../
Loading

0 comments on commit c0a5380

Please sign in to comment.