| 6 | ) |
| 7 | |
| 8 | func findFlagsPrefix(flags []string) []string { |
| 9 | if len(flags) == 0 { |
| 10 | return flags |
| 11 | } |
| 12 | |
| 13 | // Split the input flags input tokens separated by "." |
| 14 | // because the want to find the prefix where segments |
| 15 | // are dot-separated. |
| 16 | tokens := [][]string{} |
| 17 | for _, flag := range flags { |
| 18 | tokens = append(tokens, strings.Split(flag, ".")) |
| 19 | } |
| 20 | |
| 21 | // Find the shortest tokens. |
| 22 | minLength := math.MaxInt32 |
| 23 | for _, t := range tokens { |
| 24 | if len(t) < minLength { |
| 25 | minLength = len(t) |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | // We iterate backward to find common suffixes. Each time |
| 30 | // a common suffix is found, we remove it from the tokens. |
| 31 | outer: |
| 32 | for i := 0; i < minLength; i++ { |
| 33 | lastToken := tokens[0][len(tokens[0])-1] |
| 34 | |
| 35 | // Interrupt if the last token is different across the flags. |
| 36 | for _, t := range tokens { |
| 37 | if t[len(t)-1] != lastToken { |
| 38 | break outer |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | // The suffix token is equal across all flags, so we |
| 43 | // remove it from all of them and re-iterate. |
| 44 | for i, t := range tokens { |
| 45 | tokens[i] = t[:len(t)-1] |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | // The remaining tokens are the different flags prefix, which we can |
| 50 | // now merge with the ".". |
| 51 | prefixes := []string{} |
| 52 | for _, t := range tokens { |
| 53 | prefixes = append(prefixes, strings.Join(t, ".")) |
| 54 | } |
| 55 | |
| 56 | return prefixes |
| 57 | } |