code: func aggregationRuleCovers(ownerRule, servantRule *rbacv1.AggregationRule) (bool, []metav1.LabelSelector) {
  	switch {
  	case ownerRule == nil && servantRule == nil:
  		return true, []metav1.LabelSelector{}
  	case ownerRule == nil && servantRule != nil:
  		return false, servantRule.ClusterRoleSelectors
  	case ownerRule != nil && servantRule == nil:
  		return true, []metav1.LabelSelector{}
  
  	}
  
  	ownerSelectors := ownerRule.ClusterRoleSelectors
  	servantSelectors := servantRule.ClusterRoleSelectors
  	uncoveredSelectors := []metav1.LabelSelector{}
  
  	for _, servantSelector := range servantSelectors {
  		covered := false
  		for _, ownerSelector := range ownerSelectors {
  			if equality.Semantic.DeepEqual(ownerSelector, servantSelector) {
  				covered = true
  				break
  			}
  		}
  		if !covered {
  			uncoveredSelectors = append(uncoveredSelectors, servantSelector)
  		}
  	}
  
  	return (len(uncoveredSelectors) == 0), uncoveredSelectors
  }
docs: // aggregationRuleCovers determines whether or not the ownerSelectors cover the servantSelectors in terms of semantically
  // equal label selectors.
  // It returns whether or not the ownerSelectors cover and a list of the rules that the ownerSelectors do not cover.