package policy
import (
"github.com/failsafe-go/failsafe-go"
"github.com/failsafe-go/failsafe-go/common"
)
type Executor [R any ] interface {
PreExecute (exec ExecutionInternal [R ]) *common .PolicyResult [R ]
Apply (innerFn func (failsafe .Execution [R ]) *common .PolicyResult [R ]) func (failsafe .Execution [R ]) *common .PolicyResult [R ]
PostExecute (exec ExecutionInternal [R ], result *common .PolicyResult [R ]) *common .PolicyResult [R ]
IsFailure (result R , err error ) bool
OnSuccess (exec ExecutionInternal [R ], result *common .PolicyResult [R ])
OnFailure (exec ExecutionInternal [R ], result *common .PolicyResult [R ]) *common .PolicyResult [R ]
}
type BaseExecutor [R any ] struct {
Executor [R ]
*BaseFailurePolicy [R ]
}
var _ Executor [any ] = &BaseExecutor [any ]{}
func (e *BaseExecutor [R ]) PreExecute (_ ExecutionInternal [R ]) *common .PolicyResult [R ] {
return nil
}
func (e *BaseExecutor [R ]) Apply (innerFn func (failsafe .Execution [R ]) *common .PolicyResult [R ]) func (failsafe .Execution [R ]) *common .PolicyResult [R ] {
return func (exec failsafe .Execution [R ]) *common .PolicyResult [R ] {
execInternal := exec .(ExecutionInternal [R ])
result := e .Executor .PreExecute (execInternal )
if result != nil {
return result
}
result = innerFn (exec )
return e .Executor .PostExecute (execInternal , result )
}
}
func (e *BaseExecutor [R ]) PostExecute (exec ExecutionInternal [R ], er *common .PolicyResult [R ]) *common .PolicyResult [R ] {
if e .Executor .IsFailure (er .Result , er .Error ) {
er = e .Executor .OnFailure (exec , er .WithFailure ())
} else {
er = er .WithDone (true , true )
e .Executor .OnSuccess (exec , er )
}
return er
}
func (e *BaseExecutor [R ]) IsFailure (result R , err error ) bool {
if e .BaseFailurePolicy != nil {
return e .BaseFailurePolicy .IsFailure (result , err )
}
return err != nil
}
func (e *BaseExecutor [R ]) OnSuccess (exec ExecutionInternal [R ], result *common .PolicyResult [R ]) {
if e .BaseFailurePolicy != nil && e .onSuccess != nil {
e .onSuccess (failsafe .ExecutionEvent [R ]{
ExecutionAttempt : exec .CopyWithResult (result ),
})
}
}
func (e *BaseExecutor [R ]) OnFailure (exec ExecutionInternal [R ], result *common .PolicyResult [R ]) *common .PolicyResult [R ] {
if e .BaseFailurePolicy != nil && e .onFailure != nil {
e .onFailure (failsafe .ExecutionEvent [R ]{
ExecutionAttempt : exec .CopyWithResult (result ),
})
}
return result
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .