45 lines
		
	
	
		
			854 B
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			854 B
		
	
	
	
		
			Go
		
	
	
	
|  | package rules | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"regexp" | ||
|  | 	"strings" | ||
|  | ) | ||
|  | 
 | ||
|  | // Checker is a Rules checker.
 | ||
|  | type Checker interface { | ||
|  | 	Check(path string) bool | ||
|  | } | ||
|  | 
 | ||
|  | // Rule is a allow/disallow rule.
 | ||
|  | type Rule struct { | ||
|  | 	Regex  bool    `json:"regex"` | ||
|  | 	Allow  bool    `json:"allow"` | ||
|  | 	Path   string  `json:"path"` | ||
|  | 	Regexp *Regexp `json:"regexp"` | ||
|  | } | ||
|  | 
 | ||
|  | // Matches matches a path against a rule.
 | ||
|  | func (r *Rule) Matches(path string) bool { | ||
|  | 	if r.Regex { | ||
|  | 		return r.Regexp.MatchString(path) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return strings.HasPrefix(path, r.Path) | ||
|  | } | ||
|  | 
 | ||
|  | // Regexp is a wrapper to the native regexp type where we
 | ||
|  | // save the raw expression.
 | ||
|  | type Regexp struct { | ||
|  | 	Raw    string `json:"raw"` | ||
|  | 	regexp *regexp.Regexp | ||
|  | } | ||
|  | 
 | ||
|  | // MatchString checks if a string matches the regexp.
 | ||
|  | func (r *Regexp) MatchString(s string) bool { | ||
|  | 	if r.regexp == nil { | ||
|  | 		r.regexp = regexp.MustCompile(r.Raw) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return r.regexp.MatchString(s) | ||
|  | } |