// Extracts the value specified by cfgHdr out of cdr func (cdre *CdrExporter) cdrFieldValue(cdr *engine.StoredCdr, cfgCdrFld *config.CfgCdrField) (string, error) { for _, fltrRl := range cfgCdrFld.FieldFilter { if fltrPass, _ := cdr.PassesFieldFilter(fltrRl); !fltrPass { return "", fmt.Errorf("Field: %s not matching filter rule %v", fltrRl.Id, fltrRl) } } layout := cfgCdrFld.Layout if len(layout) == 0 { layout = time.RFC3339 } var retVal string // Concatenate the resulting values for _, rsrFld := range cfgCdrFld.Value { var cdrVal string switch rsrFld.Id { case COST_DETAILS: // Special case when we need to further extract cost_details out of logDb if cdr.ExtraFields[COST_DETAILS], err = cdre.getCdrCostDetails(cdr.CgrId, cdr.MediationRunId); err != nil { return "", err } else { cdrVal = cdr.FieldAsString(rsrFld) } case utils.COST: cdrVal = cdr.FormatCost(cdre.costShiftDigits, cdre.roundDecimals) case utils.USAGE: cdrVal = cdr.FormatUsage(layout) case utils.SETUP_TIME: cdrVal = cdr.SetupTime.Format(layout) case utils.ANSWER_TIME: // Format time based on layout cdrVal = cdr.AnswerTime.Format(layout) case utils.DESTINATION: cdrVal = cdr.FieldAsString(rsrFld) if cdre.maskLen != -1 && cdre.maskedDestination(cdrVal) { cdrVal = MaskDestination(cdrVal, cdre.maskLen) } default: cdrVal = cdr.FieldAsString(rsrFld) } retVal += cdrVal } return retVal, nil }