github.com/goreleaser/goreleaser@v1.25.1/internal/middleware/skip/skip.go (about) 1 // Package skip can skip an entire Action. 2 package skip 3 4 import ( 5 "fmt" 6 7 "github.com/caarlos0/log" 8 "github.com/goreleaser/goreleaser/internal/middleware" 9 "github.com/goreleaser/goreleaser/pkg/context" 10 ) 11 12 // Skipper defines a method to skip an entire Piper. 13 type Skipper interface { 14 // Skip returns true if the Piper should be skipped. 15 Skip(ctx *context.Context) bool 16 fmt.Stringer 17 } 18 19 // Skipper defines a method to skip an entire Piper. 20 type ErrSkipper interface { 21 // Skip returns true if the Piper should be skipped. 22 Skip(ctx *context.Context) (bool, error) 23 fmt.Stringer 24 } 25 26 // Maybe returns an action that skips immediately if the given p is a Skipper 27 // and its Skip method returns true. 28 func Maybe(skipper interface{}, next middleware.Action) middleware.Action { 29 if skipper, ok := skipper.(Skipper); ok { 30 return Maybe(wrapper{skipper}, next) 31 } 32 if skipper, ok := skipper.(ErrSkipper); ok { 33 return func(ctx *context.Context) error { 34 skip, err := skipper.Skip(ctx) 35 if err != nil { 36 return fmt.Errorf("skip %s: %w", skipper.String(), err) 37 } 38 if skip { 39 log.Debugf("skipped %s", skipper.String()) 40 return nil 41 } 42 return next(ctx) 43 } 44 } 45 return next 46 } 47 48 var _ ErrSkipper = wrapper{} 49 50 type wrapper struct { 51 skipper Skipper 52 } 53 54 // String implements SkipperErr 55 func (w wrapper) String() string { 56 return w.skipper.String() 57 } 58 59 // Skip implements SkipperErr 60 func (w wrapper) Skip(ctx *context.Context) (bool, error) { 61 return w.skipper.Skip(ctx), nil 62 }