Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d8e40c8 authored by Paul Duffin's avatar Paul Duffin Committed by android-build-merger
Browse files

Abstract property value matching logic behind an interface am: 73bf054a

am: 34ae60b2

Change-Id: If903d26eb145c3489fcf9ef8567f55c43c648f46
parents 20ec5525 34ae60b2
Loading
Loading
Loading
Loading
+47 −10
Original line number Diff line number Diff line
@@ -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
	matcher ValueMatcher
}

// A NeverAllow rule.
@@ -229,7 +259,7 @@ 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,
		matcher: selectMatcher(value),
	})
	return r
}
@@ -237,11 +267,18 @@ func (r *rule) With(properties, value string) Rule {
func (r *rule) Without(properties, value string) Rule {
	r.unlessProps = append(r.unlessProps, ruleProperty{
		fields:  fieldNamesForProperties(properties),
		value:  value,
		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) {