package main import ( "ccat/stack" "os" "regexp" "strings" "gopkg.in/yaml.v2" ) // loadConfig takes in the filename of a config file. It reads the file, // and returns a stack of RegColors, with the item at the bottom being the one that // was read first. This ensures that, _when accessing the RegColors in the stack, the last // one (ie. the one that was read first) has highest precedence_. // If there is an error compiling the regular expressions, the error is returned. func loadConfig(configFilename string) (stack.Stack[regColor], error) { configFile, err := os.ReadFile(configFilename) if err != nil { panic(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) } // Here, I create the stack which will eventually be returned. // Each element of the MapSlice (created above) stores the key and value of a line // in the file. // Each regex string is compiled, and if there is an error, that error is // returned. regColorStack := stack.NewStack[regColor](len(strings.Split(string(configFile), "\n"))) // The stack will have the same size as the number of lines in the file for _, item := range tempMapSlice { re := regexp.MustCompile(item.Key.(string)) clr, err := newColor(item.Value.(string)) if err != nil { panic(err) } // If we got past the panic, then the color _must_ be valid. regColorStack.Push(regColor{re, clr}) } return *regColorStack, nil }