blob: bdec385613fdf062bc5c5c5a100df74c024a0f38 [file] [log] [blame]
package publicparams
import (
"go.skia.org/infra/go/paramtools"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/golden/go/types"
)
// Matcher is the interface for determining if a trace's params fit a certain set of conditions.
type Matcher interface {
Matches(traceParams paramtools.Params) bool
}
type corpusName string
type keyField string
type value string
type MatchingRules map[corpusName]map[keyField][]value
type paramMatcher struct {
Rules MatchingRules
}
// Matches implements the Matcher interface following a set of rules set when constructed.
// If a param is not in a set of required params or does not match the list of known corpora,
// this will return false.
func (m paramMatcher) Matches(traceParams paramtools.Params) bool {
if len(traceParams) == 0 {
return false
}
corpus, ok := traceParams[types.CorpusField]
if !ok {
return false
}
requiredKeys, corpusOK := m.Rules[corpusName(corpus)]
if !corpusOK {
return false
}
for key, values := range requiredKeys {
traceValue, traceHasKey := traceParams[string(key)]
if !traceHasKey {
return false
}
matchedValue := false
for _, v := range values {
if string(v) == traceValue {
matchedValue = true
break
}
}
if !matchedValue {
return false
}
}
return true
}
// MatcherFromRules creates a param matcher from a map of rules. The top level keys in this map are
// the publicly viewable corpora. The values for those corpora is another map of required keys
// and their corresponding allowed values. If a trace belonging to a given corpus has all of the
// required keys and the corresponding values are in the list of allowed values, then it will
// be publicly visible. Otherwise, it will not be. See publicparams_test.go for a concrete example.
func MatcherFromRules(rules MatchingRules) (*paramMatcher, error) {
if len(rules) == 0 {
return nil, skerr.Fmt("No rules detected.")
}
if _, hasEmptyCorpus := rules[""]; hasEmptyCorpus {
return nil, skerr.Fmt("Cannot contain empty corpus")
}
return &paramMatcher{Rules: rules}, nil
}
// Make sure paramMatcher implements the Matcher interface.
var _ Matcher = (*paramMatcher)(nil)