package system import "git.tebibyte.media/tomo/tomo" type styleApplicator struct { style *tomo.Style role tomo.Role rules []tomo.Rule } func (this *styleApplicator) apply (box anyBox) { if box.Role() != this.role { this.role = box.Role() // the role has changed, so re-cache the list of rules this.rules = nil for _, rule := range this.style.Rules { role := box.Role() // blank fields match anything if rule.Role.Package == "" { role.Package = "" } if rule.Role.Object == "" { role.Object = "" } if rule.Role == role { this.rules = append(this.rules, rule) } } } // compile list of attributes by searching through the cached ruleset attrs := make(tomo.AttrSet) for _, rule := range this.rules { satisifed := true for _, tag := range rule.Tags { if !box.Tag(tag) { satisifed = false break } } if satisifed { attrs.MergeOver(rule.Set) } } // apply that list of attributes for _, attr := range attrs { box.setAttr(attr, false) } }