package middleware
import
type FinalizeInput struct {
Request interface{}
}
type FinalizeOutput struct {
Result interface{}
}
type FinalizeHandler interface {
HandleFinalize(ctx context.Context, in FinalizeInput) (
out FinalizeOutput, metadata Metadata, err error,
)
}
type FinalizeMiddleware interface {
ID() string
HandleFinalize(ctx context.Context, in FinalizeInput, next FinalizeHandler) (
out FinalizeOutput, metadata Metadata, err error,
)
}
func ( string, func(context.Context, FinalizeInput, FinalizeHandler) (FinalizeOutput, Metadata, error)) FinalizeMiddleware {
return finalizeMiddlewareFunc{
id: ,
fn: ,
}
}
type finalizeMiddlewareFunc struct {
id string
fn func(context.Context, FinalizeInput, FinalizeHandler) (
FinalizeOutput, Metadata, error,
)
}
func ( finalizeMiddlewareFunc) () string { return .id }
func ( finalizeMiddlewareFunc) ( context.Context, FinalizeInput, FinalizeHandler) (
FinalizeOutput, Metadata, error,
) {
return .fn(, , )
}
var _ FinalizeMiddleware = (finalizeMiddlewareFunc{})
type FinalizeStep struct {
ids *orderedIDs
}
func () *FinalizeStep {
return &FinalizeStep{
ids: newOrderedIDs(),
}
}
var _ Middleware = (*FinalizeStep)(nil)
func ( *FinalizeStep) () string {
return "Finalize stack step"
}
func ( *FinalizeStep) ( context.Context, interface{}, Handler) (
interface{}, Metadata, error,
) {
:= .ids.GetOrder()
var FinalizeHandler = finalizeWrapHandler{Next: }
for := len() - 1; >= 0; -- {
= decoratedFinalizeHandler{
Next: ,
With: [].(FinalizeMiddleware),
}
}
:= FinalizeInput{
Request: ,
}
, , := .HandleFinalize(, )
return .Result, ,
}
func ( *FinalizeStep) ( string) (FinalizeMiddleware, bool) {
, := .ids.Get()
if ! {
return nil, false
}
return .(FinalizeMiddleware),
}
func ( *FinalizeStep) ( FinalizeMiddleware, RelativePosition) error {
return .ids.Add(, )
}
func ( *FinalizeStep) ( FinalizeMiddleware, string, RelativePosition) error {
return .ids.Insert(, , )
}
func ( *FinalizeStep) ( string, FinalizeMiddleware) (FinalizeMiddleware, error) {
, := .ids.Swap(, )
if != nil {
return nil,
}
return .(FinalizeMiddleware), nil
}
func ( *FinalizeStep) ( string) (FinalizeMiddleware, error) {
, := .ids.Remove()
if != nil {
return nil,
}
return .(FinalizeMiddleware), nil
}
func ( *FinalizeStep) () []string {
return .ids.List()
}
func ( *FinalizeStep) () {
.ids.Clear()
}
type finalizeWrapHandler struct {
Next Handler
}
var _ FinalizeHandler = (*finalizeWrapHandler)(nil)
func ( finalizeWrapHandler) ( context.Context, FinalizeInput) (
FinalizeOutput, Metadata, error,
) {
, , := .Next.Handle(, .Request)
return FinalizeOutput{
Result: ,
}, ,
}
type decoratedFinalizeHandler struct {
Next FinalizeHandler
With FinalizeMiddleware
}
var _ FinalizeHandler = (*decoratedFinalizeHandler)(nil)
func ( decoratedFinalizeHandler) ( context.Context, FinalizeInput) (
FinalizeOutput, Metadata, error,
) {
return .With.HandleFinalize(, , .Next)
}
type FinalizeHandlerFunc func(context.Context, FinalizeInput) (FinalizeOutput, Metadata, error)
func ( FinalizeHandlerFunc) ( context.Context, FinalizeInput) (FinalizeOutput, Metadata, error) {
return (, )
}
var _ FinalizeHandler = FinalizeHandlerFunc(nil)