From 799fafafe9dec61c7abbd8f4bbb3aea309c7b1b5 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Sun, 1 Jun 2025 13:45:32 -0400 Subject: [PATCH] Return errors, rather than printing them; move PrintError() to front package --- back/cmd.go | 7 ++++--- back/files.go | 21 +++++++++++---------- back/general.go | 18 ------------------ front/general.go | 21 +++++++++++++++++++++ 4 files changed, 36 insertions(+), 31 deletions(-) create mode 100644 front/general.go diff --git a/back/cmd.go b/back/cmd.go index e90f33c..cb15c49 100644 --- a/back/cmd.go +++ b/back/cmd.go @@ -2,24 +2,25 @@ package back import ( "bufio" + "errors" "io" "os" "os/exec" ) // WriteToStdin is a utility function that writes a string to a command's stdin. -func WriteToStdin(cmd *exec.Cmd, input string) { +func WriteToStdin(cmd *exec.Cmd, input string) error { stdin, err := cmd.StdinPipe() if err != nil { - PrintError("Failed to access stdin for system command: "+err.Error(), ErrorOther, true) + return errors.New("unable to access stdin for system command: " + err.Error()) } - go func() { defer func(stdin io.WriteCloser) { _ = stdin.Close() // error ignored; if stdin could be accessed, it can probably be closed }(stdin) _, _ = io.WriteString(stdin, input) }() + return nil } // ReadFromStdin is a utility function that reads a string from stdin. diff --git a/back/files.go b/back/files.go index e6ff9a2..3bf32a3 100644 --- a/back/files.go +++ b/back/files.go @@ -1,6 +1,7 @@ package back import ( + "errors" "os" "strings" ) @@ -8,34 +9,34 @@ import ( // TargetIsFile checks if the targetLocation is a file, directory, or is inaccessible. // Requires: failCondition (0 = fail on inaccessible, 1 = fail on inaccessible&file, 2 = fail on inaccessible&directory). // Returns: isFile, isAccessible. -func TargetIsFile(targetLocation string, errorOnFail bool, failCondition uint8) (bool, bool) { +func TargetIsFile(targetLocation string, errorOnFail bool, failCondition uint8) (bool, bool, error) { targetInfo, err := os.Stat(targetLocation) if err != nil { if errorOnFail { - PrintError("Failed to access \""+targetLocation+"\" - Ensure it exists and has the correct permissions", ErrorTargetNotFound, true) + return false, false, errors.New("unable to access \"" + targetLocation + "\": " + err.Error()) } - return false, false + return false, false, nil } if targetInfo.IsDir() { if errorOnFail && failCondition == 2 { - PrintError("\""+targetLocation+"\" is a directory", ErrorTargetWrongType, true) + return false, true, errors.New("\"" + targetLocation + "\" is a directory") } - return false, true + return false, true, nil } else { if errorOnFail && failCondition == 1 { - PrintError("\""+targetLocation+"\" is a file", ErrorTargetWrongType, true) + return true, true, errors.New("\"" + targetLocation + "\" is a file") } - return true, true + return true, true, nil } } // CreateTempFile creates a temporary file and returns a pointer to it. -func CreateTempFile() *os.File { +func CreateTempFile() (*os.File, error) { tempFile, err := os.CreateTemp("", "*.markdown") if err != nil { - PrintError("Failed to create temporary file: "+err.Error(), ErrorWrite, true) + return nil, errors.New("unable to create temporary file: " + err.Error()) } - return tempFile + return tempFile, nil } // ExpandPathWithHome, given a path (as a string) containing "~", returns the path with "~" expanded to the user's home directory. diff --git a/back/general.go b/back/general.go index d4bb6ba..08d5a3f 100644 --- a/back/general.go +++ b/back/general.go @@ -1,10 +1,5 @@ package back -import ( - "fmt" - "os" -) - // RemoveTrailingEmptyStrings removes empty strings from the end of a slice. func RemoveTrailingEmptyStrings(slice []string) []string { for i := len(slice) - 1; i >= 0; i-- { @@ -14,16 +9,3 @@ func RemoveTrailingEmptyStrings(slice []string) []string { } return nil } - -// PrintError prints an error message in the standard libmutton format and exits with the specified exit code. -// Requires: message (the error message to print), -// exitCode (the exit code to use), -// forceHardExit (if true, exit immediately; if false, allow soft exit for interactive clients). -func PrintError(message string, exitCode int, forceHardExit bool) { - fmt.Println(AnsiError + message + AnsiReset) - if forceHardExit { - os.Exit(exitCode) - } else { - Exit(exitCode) - } -} diff --git a/front/general.go b/front/general.go new file mode 100644 index 0000000..4345796 --- /dev/null +++ b/front/general.go @@ -0,0 +1,21 @@ +package front + +import ( + "fmt" + "os" + + "github.com/rwinkhart/go-boilerplate/back" +) + +// PrintError prints an error message in the MUTN format and exits with the specified exit code. +// Requires: message (the error message to print), +// exitCode (the exit code to use), +// forceHardExit (if true, exit immediately; if false, allow soft exit for interactive clients). +func PrintError(message string, exitCode int, forceHardExit bool) { + fmt.Println(back.AnsiError + message + back.AnsiReset) + if forceHardExit { + os.Exit(exitCode) + } else { + back.Exit(exitCode) + } +}