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  }