github.com/ngicks/gokugen@v0.0.5/middleware/recover/recover.go (about) 1 package recover 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "github.com/ngicks/gokugen" 9 ) 10 11 type RecoveredError struct { 12 OrginalErr any 13 } 14 15 func (re *RecoveredError) Error() string { 16 return fmt.Sprintf( 17 "recovered error: workFn panicked and recoved in Recover middleware. original err = %s", 18 re.OrginalErr, 19 ) 20 } 21 22 type RecoverMiddleware struct{} 23 24 func New() *RecoverMiddleware { 25 return &RecoverMiddleware{} 26 } 27 28 func (_ *RecoverMiddleware) Middleware(handler gokugen.ScheduleHandlerFn) gokugen.ScheduleHandlerFn { 29 return func(ctx gokugen.SchedulerContext) (gokugen.Task, error) { 30 return handler( 31 gokugen.WrapContext( 32 ctx, 33 gokugen.WithWorkFnWrapper( 34 func(self gokugen.SchedulerContext, workFn gokugen.WorkFn) gokugen.WorkFn { 35 return func(taskCtx context.Context, scheduled time.Time) (ret any, err error) { 36 defer func() { 37 if recoveredErr := recover(); recoveredErr != nil { 38 err = &RecoveredError{ 39 OrginalErr: recoveredErr, 40 } 41 } 42 }() 43 ret, err = workFn(taskCtx, scheduled) 44 return 45 } 46 }, 47 ), 48 ), 49 ) 50 } 51 }