github.com/tooploox/oya@v0.0.21-0.20230524103240-1cda1861aad6/cmd/internal/errors.go (about)

     1  package internal
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"strings"
     7  
     8  	"github.com/tooploox/oya/pkg/errors"
     9  	"github.com/tooploox/oya/pkg/task"
    10  )
    11  
    12  func HandleError(out io.Writer, err error) int {
    13  	PrintError(out, err)
    14  	return ExitCode(err)
    15  }
    16  
    17  func PrintError(out io.Writer, err error) {
    18  	switch err := err.(type) {
    19  	case errors.Error:
    20  		printErrorWithTrace(out, err)
    21  	default:
    22  		printSep(out)
    23  		printError(out, err)
    24  	}
    25  }
    26  
    27  func ExitCode(err error) int {
    28  	var sfe task.ErrScriptFail
    29  	if errors.As(err, &sfe) {
    30  		return sfe.ExitCode
    31  	}
    32  	return 1
    33  }
    34  
    35  func printSep(out io.Writer) {
    36  	sepChar := "-"
    37  	sepWidth := 78
    38  	fmt.Fprintln(out, strings.Repeat(sepChar, sepWidth))
    39  }
    40  
    41  func printErrorWithTrace(out io.Writer, err errors.Error) {
    42  	if cause := err.Cause(); cause != nil {
    43  		PrintError(out, cause)
    44  	}
    45  	printSep(out)
    46  	err.Print(out)
    47  	fmt.Fprintln(out)
    48  }
    49  
    50  func printError(out io.Writer, err error) {
    51  	fmt.Fprintln(out, "Error:", err)
    52  	fmt.Fprintln(out)
    53  }