aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/ryanuber/go-glob/glob.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/ryanuber/go-glob/glob.go')
-rw-r--r--vendor/github.com/ryanuber/go-glob/glob.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/vendor/github.com/ryanuber/go-glob/glob.go b/vendor/github.com/ryanuber/go-glob/glob.go
new file mode 100644
index 0000000..e67db3b
--- /dev/null
+++ b/vendor/github.com/ryanuber/go-glob/glob.go
@@ -0,0 +1,56 @@
+package glob
+
+import "strings"
+
+// The character which is treated like a glob
+const GLOB = "*"
+
+// Glob will test a string pattern, potentially containing globs, against a
+// subject string. The result is a simple true/false, determining whether or
+// not the glob pattern matched the subject text.
+func Glob(pattern, subj string) bool {
+ // Empty pattern can only match empty subject
+ if pattern == "" {
+ return subj == pattern
+ }
+
+ // If the pattern _is_ a glob, it matches everything
+ if pattern == GLOB {
+ return true
+ }
+
+ parts := strings.Split(pattern, GLOB)
+
+ if len(parts) == 1 {
+ // No globs in pattern, so test for equality
+ return subj == pattern
+ }
+
+ leadingGlob := strings.HasPrefix(pattern, GLOB)
+ trailingGlob := strings.HasSuffix(pattern, GLOB)
+ end := len(parts) - 1
+
+ // Go over the leading parts and ensure they match.
+ for i := 0; i < end; i++ {
+ idx := strings.Index(subj, parts[i])
+
+ switch i {
+ case 0:
+ // Check the first section. Requires special handling.
+ if !leadingGlob && idx != 0 {
+ return false
+ }
+ default:
+ // Check that the middle parts match.
+ if idx < 0 {
+ return false
+ }
+ }
+
+ // Trim evaluated text from subj as we loop over the pattern.
+ subj = subj[idx+len(parts[i]):]
+ }
+
+ // Reached the last section. Requires special handling.
+ return trailingGlob || strings.HasSuffix(subj, parts[end])
+}