gopkg.in/alecthomas/gometalinter.v3@v3.0.0/_linters/src/github.com/ryanuber/go-glob/glob.go (about) 1 package glob 2 3 import "strings" 4 5 // The character which is treated like a glob 6 const GLOB = "*" 7 8 // Glob will test a string pattern, potentially containing globs, against a 9 // subject string. The result is a simple true/false, determining whether or 10 // not the glob pattern matched the subject text. 11 func Glob(pattern, subj string) bool { 12 // Empty pattern can only match empty subject 13 if pattern == "" { 14 return subj == pattern 15 } 16 17 // If the pattern _is_ a glob, it matches everything 18 if pattern == GLOB { 19 return true 20 } 21 22 parts := strings.Split(pattern, GLOB) 23 24 if len(parts) == 1 { 25 // No globs in pattern, so test for equality 26 return subj == pattern 27 } 28 29 leadingGlob := strings.HasPrefix(pattern, GLOB) 30 trailingGlob := strings.HasSuffix(pattern, GLOB) 31 end := len(parts) - 1 32 33 // Go over the leading parts and ensure they match. 34 for i := 0; i < end; i++ { 35 idx := strings.Index(subj, parts[i]) 36 37 switch i { 38 case 0: 39 // Check the first section. Requires special handling. 40 if !leadingGlob && idx != 0 { 41 return false 42 } 43 default: 44 // Check that the middle parts match. 45 if idx < 0 { 46 return false 47 } 48 } 49 50 // Trim evaluated text from subj as we loop over the pattern. 51 subj = subj[idx+len(parts[i]):] 52 } 53 54 // Reached the last section. Requires special handling. 55 return trailingGlob || strings.HasSuffix(subj, parts[end]) 56 }