summary refs log tree commit diff stats
path: root/grus.go
diff options
context:
space:
mode:
Diffstat (limited to 'grus.go')
-rw-r--r--grus.go94
1 files changed, 59 insertions, 35 deletions
diff --git a/grus.go b/grus.go
index f84d9a1..24714c4 100644
--- a/grus.go
+++ b/grus.go
@@ -16,11 +16,40 @@ func grus() {
 
 	version := "v0.2.1"
 
+	// Print version if first argument is version.
 	if os.Args[1] == "version" {
 		fmt.Printf("Grus %s\n", version)
 		os.Exit(0)
 	}
 
+	// Define default environment variables.
+	envVar := make(map[string]bool)
+	envVar["GRUS_SEARCH_ALL"] = false
+	envVar["GRUS_ANAGRAMS"] = true
+	envVar["GRUS_STRICT_UNJUMBLE"] = false
+	envVar["GRUS_PRINT_PATH"] = false
+
+	// Check environment variables.
+	for k, _ := range envVar {
+		env := os.Getenv(k)
+		if env == "false" ||
+			env == "0" {
+			envVar[k] = false
+		} else if env == "true" ||
+			env == "1" {
+			envVar[k] = true
+		}
+	}
+
+	// Print environment variables if first argument is env.
+	if os.Args[1] == "env" {
+		for k, v := range envVar {
+			fmt.Printf("%s: %t\n", k, v)
+		}
+		os.Exit(0)
+	}
+
+	// Define default dictionaries.
 	dicts := []string{
 		"/usr/local/share/dict/words",
 		"/usr/local/share/dict/web2",
@@ -36,31 +65,10 @@ func grus() {
 		dicts = append(os.Args[2:], dicts...)
 	}
 
-	// Check if user has asked to search in all dictionaries.
-	searchAll := false
-	searchAllEnv := os.Getenv("GRUS_SEARCH_ALL")
-	if searchAllEnv == "true" ||
-		searchAllEnv == "1" {
-		searchAll = true
-	}
-
-	// Check if user wants anagrams.
-	anagrams := false
-	anagramsEnv := os.Getenv("GRUS_ANAGRAMS")
-	if anagramsEnv == "true" ||
-		anagramsEnv == "1" {
-		anagrams = true
-	}
+	// We use this to record if the word was unjumbled.
+	unjumbled := false
 
-	// Check if user wants to print dictionary path.
-	printPath := false
-	printPathEnv := os.Getenv("GRUS_PRINT_PATH")
-	if printPathEnv == "true" ||
-		printPathEnv == "1" {
-		printPath = true
-	}
-
-	for _, dict := range dicts {
+	for k, dict := range dicts {
 		if _, err := os.Stat(dict); err != nil &&
 			!os.IsNotExist(err) {
 			// Error is not nil & also it's not path
@@ -75,16 +83,15 @@ func grus() {
 		}
 
 		// Print path to dictionary if printPath is true.
-		if printPath {
+		if envVar["GRUS_PRINT_PATH"] {
+			if k != 0 {
+				fmt.Println()
+			}
 			fmt.Println(dict)
 		}
 
 		file, err := os.Open(dict)
 		panicOnErr(err)
-		defer file.Close()
-
-		// We use this to record if the word was unjumbled.
-		unjumbled := false
 
 		scanner := bufio.NewScanner(file)
 		for scanner.Scan() {
@@ -96,21 +103,38 @@ func grus() {
 				fmt.Println(scanner.Text())
 				// If the user doesn't want anagrams
 				// then exit the program.
-				if !anagrams {
+				if !envVar["GRUS_ANAGRAMS"] {
 					os.Exit(0)
 				}
 				unjumbled = true
 			}
 		}
 		panicOnErr(scanner.Err())
+		file.Close()
+
+		// If the user has asked to strictly unjumble then we
+		// cannot exit till it's unjumbled.
+		if envVar["GRUS_STRICT_UNJUMBLE"] &&
+			!unjumbled {
+			// If user has asked to strictly unjumble & we
+			// haven't done that yet & this is the last
+			// dictionary then we've failed to unjumble it
+			// & the program must exit with a non-zero
+			// exit code.
+			if k == len(dicts)-1 {
+				os.Exit(1)
+			}
 
-		// If word was unjumbled & user hasn't asked to search
-		// in all dictionaries then exit the program otherwise
-		// keep searching in other dictionaries.
-		if unjumbled &&
-			!searchAll {
+			// Cannot exit, must search next dictionary.
+			continue
+		}
+
+		// If user hasn't asked to search all dictionaries
+		// then exit the program.
+		if !envVar["GRUS_SEARCH_ALL"] {
 			os.Exit(0)
 		}
+
 	}
 }