code: func (cs ConfigSet) Validate(ctx context.Context, val ConfigSetValidator) *ValidationResult {
  	req := &ValidationRequest{
  		ConfigSet: cs.Name,
  		Files:     make([]*config.LuciConfigValidateConfigRequestMessageFile, len(cs.Data)),
  	}
  
  	logging.Infof(ctx, "Sending to LUCI Config for validation as config set %q:", cs.Name)
  	for idx, f := range cs.Files() {
  		logging.Infof(ctx, "  %s (%d bytes)", f, len(cs.Data[f]))
  		req.Files[idx] = &config.LuciConfigValidateConfigRequestMessageFile{
  			Path:    f,
  			Content: base64.StdEncoding.EncodeToString(cs.Data[f]),
  		}
  	}
  
  	messages, err := val.Validate(ctx, req)
  
  	res := &ValidationResult{
  		ConfigSet: cs.Name,
  		Messages:  messages,
  	}
  	if err != nil {
  		res.RPCError = err.Error()
  		res.Failed = true
  	}
  	return res
  }
docs: // Validate sends the config set for validation to LUCI Config service.
  //
  // Returns ValidationResult with a list of validation message (errors, warnings,
  // etc). The list of messages may be empty if the config set is 100% valid.
  //
  // If the RPC call itself failed, ValidationResult is still returned, but it has
  // only ConfigSet and RPCError fields populated.