// Extracts the value specified by cfgHdr out of cdr func (cdre *CdrExporter) cdrFieldValue(cdr *engine.CDR, cfgCdrFld *config.CfgCdrField) (string, error) { passesFilters := true for _, cdfFltr := range cfgCdrFld.FieldFilter { if !cdfFltr.FilterPasses(cdr.FieldAsString(cdfFltr)) { passesFilters = false break } } if !passesFilters { // Not passes filters, ignore this replication return "", fmt.Errorf("Filters not passing") } 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.RunID); 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 }