code: func (r *Rule) Validate() (errs []error) {
  	if r.Record != "" && r.Alert != "" {
  		errs = append(errs, errors.Errorf("only one of 'record' and 'alert' must be set"))
  	}
  	if r.Record == "" && r.Alert == "" {
  		errs = append(errs, errors.Errorf("one of 'record' or 'alert' must be set"))
  	}
  
  	if r.Expr == "" {
  		errs = append(errs, errors.Errorf("field 'expr' must be set in rule"))
  	} else if _, err := promql.ParseExpr(r.Expr); err != nil {
  		errs = append(errs, errors.Errorf("could not parse expression: %s", err))
  	}
  	if r.Record != "" {
  		if len(r.Annotations) > 0 {
  			errs = append(errs, errors.Errorf("invalid field 'annotations' in recording rule"))
  		}
  		if r.For != 0 {
  			errs = append(errs, errors.Errorf("invalid field 'for' in recording rule"))
  		}
  		if !model.IsValidMetricName(model.LabelValue(r.Record)) {
  			errs = append(errs, errors.Errorf("invalid recording rule name: %s", r.Record))
  		}
  	}
  
  	for k, v := range r.Labels {
  		if !model.LabelName(k).IsValid() {
  			errs = append(errs, errors.Errorf("invalid label name: %s", k))
  		}
  
  		if !model.LabelValue(v).IsValid() {
  			errs = append(errs, errors.Errorf("invalid label value: %s", v))
  		}
  	}
  
  	for k := range r.Annotations {
  		if !model.LabelName(k).IsValid() {
  			errs = append(errs, errors.Errorf("invalid annotation name: %s", k))
  		}
  	}
  
  	errs = append(errs, testTemplateParsing(r)...)
  	return errs
  }
docs: // Validate the rule and return a list of encountered errors.