nolint:gocyclo
(pattern string)
| 36 | |
| 37 | //nolint:gocyclo |
| 38 | func PatternToRegex(pattern string) (string, error) { |
| 39 | var rpattern strings.Builder |
| 40 | rpattern.WriteString("^") |
| 41 | pos := 0 |
| 42 | errors := map[int]string{} |
| 43 | for pos < len(pattern) { |
| 44 | switch pattern[pos] { |
| 45 | case '*': |
| 46 | if pos+1 < len(pattern) && pattern[pos+1] == '*' { |
| 47 | if pos+2 < len(pattern) && pattern[pos+2] == '/' { |
| 48 | rpattern.WriteString("(.+/)?") |
| 49 | pos += 3 |
| 50 | } else { |
| 51 | rpattern.WriteString(".*") |
| 52 | pos += 2 |
| 53 | } |
| 54 | } else { |
| 55 | rpattern.WriteString("[^/]*") |
| 56 | pos++ |
| 57 | } |
| 58 | case '+', '?': |
| 59 | if pos > 0 { |
| 60 | rpattern.WriteByte(pattern[pos]) |
| 61 | } else { |
| 62 | rpattern.WriteString(regexp.QuoteMeta(string([]byte{pattern[pos]}))) |
| 63 | } |
| 64 | pos++ |
| 65 | case '[': |
| 66 | rpattern.WriteByte(pattern[pos]) |
| 67 | pos++ |
| 68 | if pos < len(pattern) && pattern[pos] == ']' { |
| 69 | errors[pos] = "Unexpected empty brackets '[]'" |
| 70 | pos++ |
| 71 | break |
| 72 | } |
| 73 | validChar := func(a, b, test byte) bool { |
| 74 | return test >= a && test <= b |
| 75 | } |
| 76 | startPos := pos |
| 77 | for pos < len(pattern) && pattern[pos] != ']' { |
| 78 | switch pattern[pos] { |
| 79 | case '-': |
| 80 | if pos <= startPos || pos+1 >= len(pattern) { |
| 81 | errors[pos] = "Invalid range" |
| 82 | pos++ |
| 83 | break |
| 84 | } |
| 85 | validRange := func(a, b byte) bool { |
| 86 | return validChar(a, b, pattern[pos-1]) && validChar(a, b, pattern[pos+1]) && pattern[pos-1] <= pattern[pos+1] |
| 87 | } |
| 88 | if !validRange('A', 'z') && !validRange('0', '9') { |
| 89 | errors[pos] = "Ranges can only include a-z, A-Z, A-z, and 0-9" |
| 90 | pos++ |
| 91 | break |
| 92 | } |
| 93 | rpattern.WriteString(pattern[pos : pos+2]) |
| 94 | pos += 2 |
| 95 | default: |
no test coverage detected
searching dependent graphs…