Abstract property value matching logic behind an interface
am: 73bf054a52
Change-Id: Ibf0ea69ea2b6be407046810b1d6fa15fe8e8dd2f
diff --git a/android/neverallow.go b/android/neverallow.go
index af91676..ad1d5bd 100644
--- a/android/neverallow.go
+++ b/android/neverallow.go
@@ -165,9 +165,39 @@
}
}
+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) 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 @@
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 @@
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) {