Skip to content

Commit

Permalink
Merge pull request #18 from gone-io/feature/1.x
Browse files Browse the repository at this point in the history
Feature/1.x
  • Loading branch information
Degfy authored May 30, 2024
2 parents b3dba47 + 564fe8d commit dcd72b1
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 244 deletions.
51 changes: 22 additions & 29 deletions cemetery.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ func isCompatible(t reflect.Type, goner Goner) bool {
}
}

func (c *cemetery) setFieldValue(v reflect.Value, ref any) error {
func (c *cemetery) setFieldValue(v reflect.Value, ref any) {
t := v.Type()

switch t.Kind() {
Expand All @@ -192,7 +192,7 @@ func (c *cemetery) setFieldValue(v reflect.Value, ref any) error {
default:
v.Set(reflect.ValueOf(ref).Elem())
}
return nil
return
}

func (c *cemetery) reviveFieldById(tag string, field reflect.StructField, v reflect.Value) (deps []Tomb, suc bool, err error) {
Expand All @@ -207,8 +207,8 @@ func (c *cemetery) reviveFieldById(tag string, field reflect.StructField, v refl

goner := tomb.GetGoner()
if isCompatible(field.Type, goner) {
err = c.setFieldValue(v, goner)
suc = err == nil
c.setFieldValue(v, goner)
suc = true
return
}

Expand All @@ -225,14 +225,23 @@ func (c *cemetery) reviveFieldById(tag string, field reflect.StructField, v refl
return
}

func (c *cemetery) checkRevive(tomb Tomb) error {
if !tomb.GonerIsRevive() {
_, err := c.reviveOneAndItsDeps(tomb)
if err != nil {
return err
}
}
return nil
}

func (c *cemetery) reviveByVampire(goner Goner, tomb Tomb, extConfig string, v reflect.Value) (suc bool, err error) {
if builder, ok := goner.(Vampire); ok {
if !tomb.GonerIsRevive() {
_, err = c.reviveOneAndItsDeps(tomb)
if err != nil {
return
}
err = c.checkRevive(tomb)
if err != nil {
return
}

err = builder.Suck(extConfig, v)
return err == nil, err
}
Expand All @@ -241,11 +250,9 @@ func (c *cemetery) reviveByVampire(goner Goner, tomb Tomb, extConfig string, v r

func (c *cemetery) reviveByVampire2(goner Goner, tomb Tomb, extConfig string, v reflect.Value, field reflect.StructField) (suc bool, err error) {
if builder, ok := goner.(Vampire2); ok {
if !tomb.GonerIsRevive() {
_, err = c.reviveOneAndItsDeps(tomb)
if err != nil {
return
}
err = c.checkRevive(tomb)
if err != nil {
return
}
err = builder.Suck(extConfig, v, field)
return err == nil, err
Expand All @@ -271,10 +278,7 @@ func (c *cemetery) reviveFieldByType(field reflect.StructField, v reflect.Value,
}
}

err = c.setFieldValue(v, container.GetGoner())
if err != nil {
return
}
c.setFieldValue(v, container.GetGoner())
suc = true
deps = append(deps, container)
}
Expand Down Expand Up @@ -316,18 +320,7 @@ func (c *cemetery) reviveSpecialTypeFields(field reflect.StructField, v reflect.
v.Set(m)
suc = true
}
default:
}
return
}

func (c *cemetery) reviveDependence(tomb Tomb) (deps []Tomb, err error) {
deps, err = c.reviveOneAndItsDeps(tomb)
if err != nil {
return
}

err = c.prophesy(append(deps, tomb)...)
return
}

Expand Down
19 changes: 19 additions & 0 deletions cemetery_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -443,3 +443,22 @@ func Test_cemetery_reviveFieldById(t *testing.T) {
}).Run()

}

func Test_cemetery_checkRevive(t *testing.T) {
type Line struct {
Flag
PointA *Point `gone:"point-a"`
PointB *Point `gone:"point-b"`
}

test := NewBuryMockCemeteryForTest()
test.
Bury(&Point{x: 1, y: 2, Index: 1}, GonerId("point-a")).
Bury(&Point{x: 1, y: 2, Index: 2}, GonerId("point-b")).
Bury(&Line{}, GonerId("line"))

theTomb := test.GetTomById(GonerId("line"))

err := test.(*cemetery).checkRevive(theTomb)
assert.Nil(t, err)
}
2 changes: 1 addition & 1 deletion h_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func TestNew(t *testing.T) {
}

func TestServe(t *testing.T) {
gone.AfterStopSignalWaitSecond = 0
gone.AfterStopSignalWaitSecond = 1
gone.Serve(func(cemetery gone.Cemetery) error {
go func() {
tom := cemetery.GetTomById(gone.IdGoneHeaven)
Expand Down
69 changes: 20 additions & 49 deletions heaven.go
Original file line number Diff line number Diff line change
@@ -1,58 +1,24 @@
package gone

import (
"errors"
"os"
"os/signal"
"reflect"
"syscall"
"time"
)

// Run 开始运行一个Gone程序;`gone.Run` 和 `gone.Serve` 的区别是:
// 1. gone.Serve启动的程序,主协程会调用 Heaven.WaitEnd 挂起等待停机信号,可以用于服务程序的开发
// 2. gone.Run启动的程序,主协程则不会挂起,运行完就结束,适合开发一致性运行的代码
//
// // 定义加载服务的Priest函数
// func LoadServer(c Cemetery) error {
// c.Bury(goneXorm.New())
// c.Bury(goneGin.New())
// return nil
// }
//
// // 加载组件的Priest函数
// func LoadComponent(c Cemetery) error {
// c.Bury(componentA.New())
// c.Bury(componentB.New())
// }
//
//
// gone.Run(LoadServer, LoadComponent)//开始运行
func Run(priests ...Priest) {
AfterStopSignalWaitSecond = 0
New(priests...).
Install().
Start().
Stop()
}

// Serve 开始服务,参考[Run](#Run)
func Serve(priests ...Priest) {
New(priests...).
Install().
Start().
WaitEnd().
Stop()
}

// New 新建Heaven; Heaven 代表了一个应用程序;
func New(priests ...Priest) Heaven {
cemetery := newCemetery()
h := heaven{
SimpleLogger: &defaultLogger{},
cemetery: cemetery,
priests: priests,
signal: make(chan os.Signal),
stopSignal: make(chan struct{}),
SimpleLogger: &defaultLogger{},
cemetery: cemetery,
priests: priests,
signal: make(chan os.Signal),
stopSignal: make(chan struct{}),
afterStopSignalWaitSecond: AfterStopSignalWaitSecond,
}

h.
Expand All @@ -77,6 +43,12 @@ type heaven struct {

signal chan os.Signal
stopSignal chan struct{}

afterStopSignalWaitSecond int
}

func (h *heaven) SetAfterStopSignalWaitSecond(sec int) {
h.afterStopSignalWaitSecond = sec
}

func getAngelType() reflect.Type {
Expand All @@ -96,9 +68,7 @@ func (h *heaven) GetHeavenStopSignal() <-chan struct{} {
func (h *heaven) burial() {
for _, priest := range h.priests {
err := priest(h.cemetery)
if err != nil {
panic(err)
}
h.panicOnError(err)
}
}

Expand Down Expand Up @@ -135,7 +105,8 @@ func (h *heaven) panicOnError(err error) {
if err == nil {
return
}
if iErr, ok := err.(InnerError); ok {
var iErr InnerError
if errors.As(err, &iErr) {
h.Errorf("%s\n", iErr.Error())
}
panic(err)
Expand Down Expand Up @@ -186,11 +157,11 @@ func (h *heaven) Stop() Heaven {
h.stopFlow()
close(h.stopSignal)

if AfterStopSignalWaitSecond > 0 {
h.Infof("WAIT %d SECOND TO STOP!!", AfterStopSignalWaitSecond)
if h.afterStopSignalWaitSecond > 0 {
h.Infof("WAIT %d SECOND TO STOP!!", h.afterStopSignalWaitSecond)
}
for i := 0; i < AfterStopSignalWaitSecond; i++ {
h.Infof("Stop in %d seconds.", AfterStopSignalWaitSecond-i)
for i := 0; i < h.afterStopSignalWaitSecond; i++ {
h.Infof("Stop in %d seconds.", h.afterStopSignalWaitSecond-i)
<-time.After(time.Second)
}
return h
Expand Down
9 changes: 1 addition & 8 deletions interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,8 @@ type DefaultLogger interface {

// Cemetery which is for burying and reviving Goner
type Cemetery interface {
//DefaultLogger

Goner

//bury(goner Goner, ids ...GonerId) Tomb

//Bury a Goner to the Cemetery
Bury(Goner, ...GonerOption) Cemetery

Expand All @@ -74,9 +70,6 @@ type Cemetery interface {
//ReviveAllFromTombs Revive all Goner from the Cemetery
ReviveAllFromTombs() error

//reviveOneFromTomb(tomb Tomb) (deps []Tomb, err error)
reviveDependence(tomb Tomb) (deps []Tomb, err error)

//GetTomById return the Tomb by the GonerId
GetTomById(GonerId) Tomb

Expand Down Expand Up @@ -120,7 +113,7 @@ type Heaven interface {
//AfterStop add a hook function which will execute after stop
AfterStop(Process) Heaven

//DefaultLogger
SetAfterStopSignalWaitSecond(sec int)
}

type AfterReviveError error
Expand Down
18 changes: 17 additions & 1 deletion prepare.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,12 @@ func (p *Preparer) AfterStop(fn any) *Preparer {
return p
}

func (p *Preparer) SetAfterStopSignalWaitSecond(sec int) {
p.heaven.SetAfterStopSignalWaitSecond(sec)
}

func (p *Preparer) Run(fns ...any) {
AfterStopSignalWaitSecond = 0
p.SetAfterStopSignalWaitSecond(0)
for _, fn := range fns {
p.AfterStart(fn)
}
Expand Down Expand Up @@ -53,3 +57,15 @@ func Prepare(priests ...Priest) *Preparer {
heaven: h,
}
}

// Run 开始运行一个Gone程序;`gone.Run` 和 `gone.Serve` 的区别是:
// 1. gone.Serve启动的程序,主协程会调用 Heaven.WaitEnd 挂起等待停机信号,可以用于服务程序的开发
// 2. gone.Run启动的程序,主协程则不会挂起,运行完就结束,适合开发一致性运行的代码
func Run(priests ...Priest) {
Prepare(priests...).Run()
}

// Serve 开始服务,参考[Run](#Run)
func Serve(priests ...Priest) {
Prepare(priests...).Serve()
}
Loading

0 comments on commit dcd72b1

Please sign in to comment.