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  }