summary refs log tree commit diff
path: root/vendor/go.mau.fi/util/glob/regex.go
blob: f224533d0f72d3cc39d2e4e20054207ec4c073fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package glob

import (
	"fmt"
	"regexp"
	"strings"
)

type RegexGlob struct {
	regex *regexp.Regexp
}

func (rg *RegexGlob) Match(s string) bool {
	return rg.regex.MatchString(s)
}

func CompileRegex(pattern string) (*RegexGlob, error) {
	var buf strings.Builder
	buf.WriteRune('^')
	for _, part := range SplitPattern(pattern) {
		if strings.ContainsRune(part, '*') || strings.ContainsRune(part, '?') {
			questions := strings.Count(part, "?")
			star := strings.ContainsRune(part, '*')
			if star {
				if questions > 0 {
					_, _ = fmt.Fprintf(&buf, ".{%d,}", questions)
				} else {
					buf.WriteString(".*")
				}
			} else if questions > 0 {
				_, _ = fmt.Fprintf(&buf, ".{%d}", questions)
			}
		} else {
			buf.WriteString(regexp.QuoteMeta(part))
		}
	}
	buf.WriteRune('$')
	regex, err := regexp.Compile(buf.String())
	if err != nil {
		return nil, err
	}
	return &RegexGlob{regex}, nil
}