Abstract property value matching logic behind an interface am: 73bf054a52
am: 34ae60b2bb
Change-Id: If903d26eb145c3489fcf9ef8567f55c43c648f46
This commit is contained in:
commit
7d8e40c8ad
|
@ -165,9 +165,39 @@ func neverallowMutator(ctx BottomUpMutatorContext) {
|
|||
}
|
||||
}
|
||||
|
||||
type ValueMatcher interface {
|
||||
test(string) bool
|
||||
String() string
|
||||
}
|
||||
|
||||
type equalMatcher struct {
|
||||
expected string
|
||||
}
|
||||
|
||||
func (m *equalMatcher) test(value string) bool {
|
||||
return m.expected == value
|
||||
}
|
||||
|
||||
func (m *equalMatcher) String() string {
|
||||
return "=" + m.expected
|
||||
}
|
||||
|
||||
type anyMatcher struct {
|
||||
}
|
||||
|
||||
func (m *anyMatcher) test(value string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *anyMatcher) String() string {
|
||||
return "=*"
|
||||
}
|
||||
|
||||
var anyMatcherInstance = &anyMatcher{}
|
||||
|
||||
type ruleProperty struct {
|
||||
fields []string // e.x.: Vndk.Enabled
|
||||
value string // e.x.: true
|
||||
fields []string // e.x.: Vndk.Enabled
|
||||
matcher ValueMatcher
|
||||
}
|
||||
|
||||
// A NeverAllow rule.
|
||||
|
@ -228,20 +258,27 @@ func (r *rule) NotModuleType(types ...string) Rule {
|
|||
|
||||
func (r *rule) With(properties, value string) Rule {
|
||||
r.props = append(r.props, ruleProperty{
|
||||
fields: fieldNamesForProperties(properties),
|
||||
value: value,
|
||||
fields: fieldNamesForProperties(properties),
|
||||
matcher: selectMatcher(value),
|
||||
})
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *rule) Without(properties, value string) Rule {
|
||||
r.unlessProps = append(r.unlessProps, ruleProperty{
|
||||
fields: fieldNamesForProperties(properties),
|
||||
value: value,
|
||||
fields: fieldNamesForProperties(properties),
|
||||
matcher: selectMatcher(value),
|
||||
})
|
||||
return r
|
||||
}
|
||||
|
||||
func selectMatcher(expected string) ValueMatcher {
|
||||
if expected == "*" {
|
||||
return anyMatcherInstance
|
||||
}
|
||||
return &equalMatcher{expected: expected}
|
||||
}
|
||||
|
||||
func (r *rule) Because(reason string) Rule {
|
||||
r.reason = reason
|
||||
return r
|
||||
|
@ -262,10 +299,10 @@ func (r *rule) String() string {
|
|||
s += " -type:" + v
|
||||
}
|
||||
for _, v := range r.props {
|
||||
s += " " + strings.Join(v.fields, ".") + "=" + v.value
|
||||
s += " " + strings.Join(v.fields, ".") + v.matcher.String()
|
||||
}
|
||||
for _, v := range r.unlessProps {
|
||||
s += " -" + strings.Join(v.fields, ".") + "=" + v.value
|
||||
s += " -" + strings.Join(v.fields, ".") + v.matcher.String()
|
||||
}
|
||||
if len(r.reason) != 0 {
|
||||
s += " which is restricted because " + r.reason
|
||||
|
@ -347,8 +384,8 @@ func hasProperty(properties []interface{}, prop ruleProperty) bool {
|
|||
continue
|
||||
}
|
||||
|
||||
check := func(v string) bool {
|
||||
return prop.value == "*" || prop.value == v
|
||||
check := func(value string) bool {
|
||||
return prop.matcher.test(value)
|
||||
}
|
||||
|
||||
if matchValue(propertiesValue, check) {
|
||||
|
|
Loading…
Reference in New Issue