package projects import ( "strings" "github.com/lithammer/fuzzysearch/fuzzy" ) // Performs a fuzzy find on the input string, returning the closest // matched based on its Levenshtein distance, along with an integer // indicating number of matches found func (c *Cache) FuzzyFindAlias(name string) []*ProjectAlias { ranks := fuzzy.RankFindFold(name, c.AliasStrings()) if ranks.Len() == 1 { c.log.Debug("Fuzzy found alias result", c.log.Args( "searchTerm", ranks[0].Source, "foundAlias", ranks[0].Target, "levenshteinDistance", ranks[0].Distance, )) } else if ranks.Len() > 1 { found := make([]string, ranks.Len()) for i, r := range ranks { found[i] = r.Target } c.log.Warn("Fuzzy found multiple aliases, try being more specific", c.log.Args("foundAliases", strings.Join(found, ", "))) } var aliases []*ProjectAlias if ranks.Len() > 0 { aliases = make([]*ProjectAlias, ranks.Len()) for i, r := range ranks { aliases[i] = c.GetAliasByName(r.Target) } } return aliases }