Would be interesting to see the performance difference if you undo that
move-&-change and change the function signature from:
func (r Ruleset) Match(path string) (*Rule, error)
to: func (r *Ruleset) Match(path string) (*Rule, error)