package misspell import ( "strings" ) // WordCase is an enum of various word casing styles type WordCase int // Various WordCase types.. likely to be not correct const ( CaseUnknown WordCase = iota CaseLower CaseUpper CaseTitle ) // CaseStyle returns what case style a word is in func CaseStyle(word string) WordCase { upperCount := 0 lowerCount := 0 // this iterates over RUNES not BYTES for i := 0; i < len(word); i++ { ch := word[i] switch { case ch >= 'a' && ch <= 'z': lowerCount++ case ch >= 'A' && ch <= 'Z': upperCount++ } } switch { case upperCount != 0 && lowerCount == 0: return CaseUpper case upperCount == 0 && lowerCount != 0: return CaseLower case upperCount == 1 && lowerCount > 0 && word[0] >= 'A' && word[0] <= 'Z': return CaseTitle } return CaseUnknown } // CaseVariations returns // If AllUpper or First-Letter-Only is upcased: add the all upper case version // If AllLower, add the original, the title and upcase forms // If Mixed, return the original, and the all upcase form // func CaseVariations(word string, style WordCase) []string { switch style { case CaseLower: return []string{word, strings.ToUpper(word[0:1]) + word[1:], strings.ToUpper(word)} case CaseUpper: return []string{strings.ToUpper(word)} default: return []string{word, strings.ToUpper(word)} } }