github.com/paketo-buildpacks/packit@v1.3.2-0.20211206231111-86b75c657449/internal/exit_handler.go (about) 1 package internal 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 ) 8 9 type Option func(handler ExitHandler) ExitHandler 10 11 func WithExitHandlerStderr(stderr io.Writer) Option { 12 return func(handler ExitHandler) ExitHandler { 13 handler.stderr = stderr 14 return handler 15 } 16 } 17 18 func WithExitHandlerStdout(stdout io.Writer) Option { 19 return func(handler ExitHandler) ExitHandler { 20 handler.stdout = stdout 21 return handler 22 } 23 } 24 25 func WithExitHandlerExitFunc(e func(int)) Option { 26 return func(handler ExitHandler) ExitHandler { 27 handler.exitFunc = e 28 return handler 29 } 30 } 31 32 type ExitHandler struct { 33 stdout io.Writer 34 stderr io.Writer 35 exitFunc func(int) 36 } 37 38 func NewExitHandler(options ...Option) ExitHandler { 39 handler := ExitHandler{ 40 stdout: os.Stdout, 41 stderr: os.Stderr, 42 exitFunc: os.Exit, 43 } 44 45 for _, option := range options { 46 handler = option(handler) 47 } 48 49 return handler 50 } 51 52 func (h ExitHandler) Error(err error) { 53 fmt.Fprintln(h.stderr, err) 54 55 var code int 56 switch err.(type) { 57 case failError: 58 code = 100 59 case nil: 60 code = 0 61 default: 62 code = 1 63 } 64 65 h.exitFunc(code) 66 }