83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package command
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gitoa.ru/go-4devs/config"
|
|
"gitoa.ru/go-4devs/console/output"
|
|
)
|
|
|
|
// ChainPrepare creates middleware for configures command.
|
|
func ChainPrepare(prepare ...PrepareFn) PrepareFn {
|
|
num := len(prepare)
|
|
if num == 1 {
|
|
return prepare[0]
|
|
}
|
|
|
|
if num > 1 {
|
|
lastI := num - 1
|
|
|
|
return func(ctx context.Context, def config.Definition, next ConfigureFn) error {
|
|
var (
|
|
chainHandler func(context.Context, config.Definition) error
|
|
curI int
|
|
)
|
|
|
|
chainHandler = func(currentCtx context.Context, currentDef config.Definition) error {
|
|
if curI == lastI {
|
|
return next(currentCtx, currentDef)
|
|
}
|
|
|
|
curI++
|
|
err := prepare[curI](currentCtx, currentDef, chainHandler)
|
|
curI--
|
|
|
|
return err
|
|
}
|
|
|
|
return prepare[0](ctx, def, chainHandler)
|
|
}
|
|
}
|
|
|
|
return func(ctx context.Context, cfg config.Definition, next ConfigureFn) error {
|
|
return next(ctx, cfg)
|
|
}
|
|
}
|
|
|
|
// ChainHandle creates middleware for executes command.
|
|
func ChainHandle(handlers ...HandleFn) HandleFn {
|
|
num := len(handlers)
|
|
if num == 1 {
|
|
return handlers[0]
|
|
}
|
|
|
|
if num > 1 {
|
|
lastI := num - 1
|
|
|
|
return func(ctx context.Context, in config.Provider, out output.Output, next ExecuteFn) error {
|
|
var (
|
|
chainHandler func(context.Context, config.Provider, output.Output) error
|
|
curI int
|
|
)
|
|
|
|
chainHandler = func(currentCtx context.Context, currentIn config.Provider, currentOut output.Output) error {
|
|
if curI == lastI {
|
|
return next(currentCtx, currentIn, currentOut)
|
|
}
|
|
|
|
curI++
|
|
err := handlers[curI](currentCtx, currentIn, currentOut, chainHandler)
|
|
curI--
|
|
|
|
return err
|
|
}
|
|
|
|
return handlers[0](ctx, in, out, chainHandler)
|
|
}
|
|
}
|
|
|
|
return func(ctx context.Context, in config.Provider, out output.Output, next ExecuteFn) error {
|
|
return next(ctx, in, out)
|
|
}
|
|
}
|