Replaced 'panic' with an error return, and a call to 'printAndExit'
This commit is contained in:
5
color.go
5
color.go
@@ -49,10 +49,11 @@ func newColor(colorString string) (color, error) {
|
||||
return clr, nil
|
||||
}
|
||||
|
||||
// newColorMust is similar to newColor, but panics if the given color isn't valid.
|
||||
// newColorMust is similar to newColor, but prints an error and exits if the given color isn't valid.
|
||||
func newColorMust(colorString string) color {
|
||||
if clr, err := newColor(colorString); err != nil {
|
||||
panic(err)
|
||||
printAndExit(err.Error())
|
||||
panic(err) // NEVER REACHED
|
||||
} else {
|
||||
return clr
|
||||
}
|
||||
|
@@ -16,16 +16,18 @@ type colorunit struct {
|
||||
// The slice of colorunits is used to fill in the color for each character.
|
||||
// The slice of bytes is used to perform the regex matching.
|
||||
// The color will be set to the current terminal foreground color.
|
||||
func loadInputFile(fileName string) ([]colorunit, []byte) {
|
||||
//
|
||||
// If there is any error reading the file, that error is returned.
|
||||
func loadInputFile(fileName string) ([]colorunit, []byte, error) {
|
||||
data, err := os.ReadFile(fileName)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, nil, err
|
||||
}
|
||||
units := make([]colorunit, len(data))
|
||||
for idx, c := range data {
|
||||
units[idx] = colorunit{byte(c), newColorMust("NONE")}
|
||||
}
|
||||
return units, data
|
||||
return units, data, nil
|
||||
}
|
||||
|
||||
// print is used to print out the character in the given colorunit, according to
|
||||
|
@@ -17,14 +17,14 @@ import (
|
||||
func loadConfig(configFilename string) (stack.Stack[regColor], error) {
|
||||
configFile, err := os.ReadFile(configFilename)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return *stack.NewStack[regColor](0), err
|
||||
}
|
||||
|
||||
// Here, I create a MapSlice. This is a slice of key-value pairs, and will
|
||||
// store the results of unmarshalling the YAML file.
|
||||
tempMapSlice := yaml.MapSlice{}
|
||||
if err := yaml.Unmarshal(configFile, &tempMapSlice); err != nil {
|
||||
panic(err)
|
||||
return *stack.NewStack[regColor](0), err
|
||||
}
|
||||
|
||||
// Here, I create the stack which will eventually be returned.
|
||||
@@ -37,9 +37,9 @@ func loadConfig(configFilename string) (stack.Stack[regColor], error) {
|
||||
re := regexp.MustCompile(item.Key.(string))
|
||||
clr, err := newColor(item.Value.(string))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return *stack.NewStack[regColor](0), err
|
||||
}
|
||||
// If we got past the panic, then the color _must_ be valid.
|
||||
// If we got past the errors, then the color _must_ be valid.
|
||||
regColorStack.Push(regColor{re, clr})
|
||||
}
|
||||
|
||||
|
20
main.go
20
main.go
@@ -8,22 +8,23 @@ import (
|
||||
)
|
||||
|
||||
// fileExists returns true if the given file exists, and false if it
|
||||
// doesn't. It panics if an error is encountered.
|
||||
// doesn't. If it encounters an error, it prints the error and exits.
|
||||
func fileExists(filename string) bool {
|
||||
if _, err := os.Stat(filename); err == nil {
|
||||
return true
|
||||
} else if errors.Is(err, os.ErrNotExist) {
|
||||
return false
|
||||
} else {
|
||||
panic(err)
|
||||
printAndExit(err.Error())
|
||||
return false // NEVER REACHED
|
||||
}
|
||||
}
|
||||
|
||||
// mustExist can be called to ensure that a file exists; it panics if
|
||||
// mustExist can be called to ensure that a file exists; it errors and exits if
|
||||
// the file doesn't exist.
|
||||
func mustExist(filename string) {
|
||||
if fileExists(filename) != true {
|
||||
panic(os.ErrNotExist)
|
||||
printAndExit(os.ErrNotExist.Error())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +52,7 @@ func printFile(fileName string) {
|
||||
mustExist(fileName)
|
||||
data, err := os.ReadFile(fileName)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
printAndExit(err.Error())
|
||||
}
|
||||
fmt.Print(string(data))
|
||||
return
|
||||
@@ -61,7 +62,7 @@ func main() {
|
||||
|
||||
// Check if user has provided a file name
|
||||
if len(os.Args) != 2 {
|
||||
panic("ERROR: Invalid number of arguments")
|
||||
printAndExit("Invalid number of arguments")
|
||||
}
|
||||
fileName := os.Args[1]
|
||||
mustExist(fileName)
|
||||
@@ -77,11 +78,14 @@ func main() {
|
||||
// If the given file has a config, load the config into a stack of regColors.
|
||||
regColorStack, err := loadConfig(configFilename)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
printAndExit(err.Error())
|
||||
}
|
||||
|
||||
// Load the input file into a colorunit slice (units) and a byte slice (data)
|
||||
units, data := loadInputFile(fileName)
|
||||
units, data, err := loadInputFile(fileName)
|
||||
if err != nil {
|
||||
printAndExit(err.Error())
|
||||
}
|
||||
|
||||
// For each regular expression in the stack, apply it to the byte slice. Find
|
||||
// the first and last index of all matches of the regex. Then apply the corresponding color
|
||||
|
Reference in New Issue
Block a user