blob: b513fc59be85eb0e1dfceeda686fcbb7b417c9ae [file] [log] [blame]
package utilities
import (
"bufio"
"errors"
"fmt"
"os"
"strings"
)
// ReadFileToMap reads a text file line by line into a map. For each line
// key: first word split by separator, value: rest of line after separator.
// Ex: Inputs: textLine: "NAME=Container-Optimized OS", sep: "="
// Outputs: map: {"NAME":"Container-Optimized OS"}
// Input:
// (string) filePath - The command-line path to the text file
// (string) sep - The separator string for the key and value pairs
// Output:
// (map[string]string) mapOfFile - The map of the read-in text file
func ReadFileToMap(filePath, sep string) (map[string]string, error) {
file, err := os.Open(filePath)
if err != nil {
return map[string]string{}, fmt.Errorf("Failed to open file %v: %v", filePath, err)
}
defer file.Close()
mapOfFile := make(map[string]string)
scanner := bufio.NewScanner(file) // Read file line by line to fill map
for scanner.Scan() {
key := strings.Split(string(scanner.Text()[:]), sep)[0]
mapOfFile[key] = strings.Split(string(scanner.Text()[:]), sep)[1]
}
if scanner.Err() != nil {
return map[string]string{}, fmt.Errorf("Failed to scan file %v: %v", filePath, scanner.Err())
}
return mapOfFile, nil
}
// CmpMapValues is a helper function that compares a value shared by two maps
/// Input:
// (map[string]string) map1 - First map to be compared
// (map[string]string) map2 - Second map to be compared
// (string) key - The key of the value be compared in both maps
// Output:
// (int) result - -1 for error, 0 for no difference, 1 for difference
func CmpMapValues(map1, map2 map[string]string, key string) (int, error) {
value1, ok1 := map1[key]
value2, ok2 := "", true
if len(map2) != 0 {
value2, ok2 = map2[key]
}
if !ok1 || !ok2 { // Error Check: At least one key is not present
return -1, errors.New("Error:" + key + " key not found in at least one of the maps")
}
if value1 != value2 {
return 1, nil
}
return 0, nil
}