func()

in bulk/job.go [449:507]


func (j *Job) FailedRecords() ([]FailedRecord, error) {
	url := j.session.ServiceURL() + bulk2Endpoint + "/" + j.info.ID + "/failedResults/"
	request, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		return nil, err
	}
	request.Header.Add("Accept", "text/csv")
	j.session.AuthorizationHeader(request)

	response, err := j.session.Client().Do(request)
	if err != nil {
		return nil, err
	}

	if response.StatusCode != http.StatusOK {
		decoder := json.NewDecoder(response.Body)
		defer response.Body.Close()
		var errs []sfdc.Error
		err = decoder.Decode(&errs)
		var errMsg error
		if err == nil {
			for _, err := range errs {
				errMsg = fmt.Errorf("job err: %s: %s", err.ErrorCode, err.Message)
			}
		} else {
			errMsg = fmt.Errorf("job err: %d %s", response.StatusCode, response.Status)
		}
		return nil, errMsg
	}

	scanner := bufio.NewScanner(response.Body)
	defer response.Body.Close()
	scanner.Split(bufio.ScanLines)
	var records []FailedRecord
	delimiter := j.delimiter()
	columns, err := j.recordResultHeader(scanner, delimiter)
	if err != nil {
		return nil, err
	}
	errorIdx, err := j.headerPosition(`sf__Error`, columns)
	if err != nil {
		return nil, err
	}
	idIdx, err := j.headerPosition(`sf__Id`, columns)
	if err != nil {
		return nil, err
	}
	fields := j.fields(columns, 2)
	for scanner.Scan() {
		var record FailedRecord
		values := strings.Split(scanner.Text(), delimiter)
		record.Error = values[errorIdx]
		record.ID = values[idIdx]
		record.Fields = j.record(fields, values[2:])
		records = append(records, record)
	}

	return records, nil
}