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
|
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 {
|
func newColorMust(colorString string) color {
|
||||||
if clr, err := newColor(colorString); err != nil {
|
if clr, err := newColor(colorString); err != nil {
|
||||||
panic(err)
|
printAndExit(err.Error())
|
||||||
|
panic(err) // NEVER REACHED
|
||||||
} else {
|
} else {
|
||||||
return clr
|
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 colorunits is used to fill in the color for each character.
|
||||||
// The slice of bytes is used to perform the regex matching.
|
// The slice of bytes is used to perform the regex matching.
|
||||||
// The color will be set to the current terminal foreground color.
|
// 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)
|
data, err := os.ReadFile(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
units := make([]colorunit, len(data))
|
units := make([]colorunit, len(data))
|
||||||
for idx, c := range data {
|
for idx, c := range data {
|
||||||
units[idx] = colorunit{byte(c), newColorMust("NONE")}
|
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
|
// 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) {
|
func loadConfig(configFilename string) (stack.Stack[regColor], error) {
|
||||||
configFile, err := os.ReadFile(configFilename)
|
configFile, err := os.ReadFile(configFilename)
|
||||||
if err != nil {
|
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
|
// Here, I create a MapSlice. This is a slice of key-value pairs, and will
|
||||||
// store the results of unmarshalling the YAML file.
|
// store the results of unmarshalling the YAML file.
|
||||||
tempMapSlice := yaml.MapSlice{}
|
tempMapSlice := yaml.MapSlice{}
|
||||||
if err := yaml.Unmarshal(configFile, &tempMapSlice); err != nil {
|
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.
|
// 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))
|
re := regexp.MustCompile(item.Key.(string))
|
||||||
clr, err := newColor(item.Value.(string))
|
clr, err := newColor(item.Value.(string))
|
||||||
if err != nil {
|
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})
|
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
|
// 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 {
|
func fileExists(filename string) bool {
|
||||||
if _, err := os.Stat(filename); err == nil {
|
if _, err := os.Stat(filename); err == nil {
|
||||||
return true
|
return true
|
||||||
} else if errors.Is(err, os.ErrNotExist) {
|
} else if errors.Is(err, os.ErrNotExist) {
|
||||||
return false
|
return false
|
||||||
} else {
|
} 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.
|
// the file doesn't exist.
|
||||||
func mustExist(filename string) {
|
func mustExist(filename string) {
|
||||||
if fileExists(filename) != true {
|
if fileExists(filename) != true {
|
||||||
panic(os.ErrNotExist)
|
printAndExit(os.ErrNotExist.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ func printFile(fileName string) {
|
|||||||
mustExist(fileName)
|
mustExist(fileName)
|
||||||
data, err := os.ReadFile(fileName)
|
data, err := os.ReadFile(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
printAndExit(err.Error())
|
||||||
}
|
}
|
||||||
fmt.Print(string(data))
|
fmt.Print(string(data))
|
||||||
return
|
return
|
||||||
@@ -61,7 +62,7 @@ func main() {
|
|||||||
|
|
||||||
// Check if user has provided a file name
|
// Check if user has provided a file name
|
||||||
if len(os.Args) != 2 {
|
if len(os.Args) != 2 {
|
||||||
panic("ERROR: Invalid number of arguments")
|
printAndExit("Invalid number of arguments")
|
||||||
}
|
}
|
||||||
fileName := os.Args[1]
|
fileName := os.Args[1]
|
||||||
mustExist(fileName)
|
mustExist(fileName)
|
||||||
@@ -77,11 +78,14 @@ func main() {
|
|||||||
// If the given file has a config, load the config into a stack of regColors.
|
// If the given file has a config, load the config into a stack of regColors.
|
||||||
regColorStack, err := loadConfig(configFilename)
|
regColorStack, err := loadConfig(configFilename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
printAndExit(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the input file into a colorunit slice (units) and a byte slice (data)
|
// 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
|
// 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
|
// the first and last index of all matches of the regex. Then apply the corresponding color
|
||||||
|
Reference in New Issue
Block a user