From 1741cca805a14066c1822a231f7031a41c42358d Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 2 Oct 2018 11:40:52 +0300 Subject: [PATCH] Replace CastFieldIfToString with IfaceAsString --- agents/dmtagent.go | 2 +- agents/kamagent.go | 23 ++++++++++++++------- agents/libhttpagent.go | 6 +++--- agents/librad.go | 2 +- cdrc/csv.go | 2 +- cdrc/fwv.go | 2 +- cdrc/xml.go | 2 +- config/navigablemap.go | 7 +++---- engine/action.go | 4 ++-- engine/filterhelpers.go | 4 ++-- loaders/libloader.go | 2 +- utils/cgrevent.go | 4 ++-- utils/dataconverter.go | 5 ++--- utils/reflect.go | 44 +++-------------------------------------- utils/reflect_test.go | 40 +++++++++++++++++++++++-------------- utils/struct.go | 2 +- 16 files changed, 65 insertions(+), 86 deletions(-) diff --git a/agents/dmtagent.go b/agents/dmtagent.go index 7011e22ae..b6f4bec8b 100644 --- a/agents/dmtagent.go +++ b/agents/dmtagent.go @@ -143,7 +143,7 @@ func (da DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestProce } else { // Query SessionS over APIs var tnt string if tntIf, has := smgEv[utils.Tenant]; has { - if tntStr, canCast := utils.CastFieldIfToString(tntIf); canCast { + if tntStr, err := utils.IfaceAsString(tntIf); err == nil { tnt = tntStr } } diff --git a/agents/kamagent.go b/agents/kamagent.go index 4efad3be4..c7d901806 100644 --- a/agents/kamagent.go +++ b/agents/kamagent.go @@ -54,12 +54,12 @@ type KamailioAgent struct { func (self *KamailioAgent) Connect() error { var err error eventHandlers := map[*regexp.Regexp][]func([]byte, string){ - regexp.MustCompile(CGR_AUTH_REQUEST): []func([]byte, string){ + regexp.MustCompile(CGR_AUTH_REQUEST): { self.onCgrAuth}, - regexp.MustCompile(CGR_CALL_START): []func([]byte, string){ + regexp.MustCompile(CGR_CALL_START): { self.onCallStart}, - regexp.MustCompile(CGR_CALL_END): []func([]byte, string){self.onCallEnd}, - regexp.MustCompile(CGR_DLG_LIST): []func([]byte, string){self.onDlgList}, + regexp.MustCompile(CGR_CALL_END): {self.onCallEnd}, + regexp.MustCompile(CGR_DLG_LIST): {self.onDlgList}, } errChan := make(chan error) for _, connCfg := range self.cfg.EvapiConns { @@ -235,9 +235,18 @@ func (self *KamailioAgent) disconnectSession(connID string, dscEv *KamSessionDis // Internal method to disconnect session in Kamailio func (ka *KamailioAgent) V1DisconnectSession(args utils.AttrDisconnectSession, reply *string) (err error) { - hEntry, _ := utils.CastFieldIfToString(args.EventStart[KamHashEntry]) - hID, _ := utils.CastFieldIfToString(args.EventStart[KamHashID]) - connID, _ := utils.CastFieldIfToString(args.EventStart[EvapiConnID]) + hEntry, err := utils.IfaceAsString(args.EventStart[KamHashEntry]) + if err != nil { + return err + } + hID, err := utils.IfaceAsString(args.EventStart[KamHashID]) + if err != nil { + return err + } + connID, err := utils.IfaceAsString(args.EventStart[EvapiConnID]) + if err != nil { + return err + } if err = ka.disconnectSession(connID, NewKamSessionDisconnect(hEntry, hID, utils.ErrInsufficientCredit.Error())); err != nil { diff --git a/agents/libhttpagent.go b/agents/libhttpagent.go index 9785b5dc9..602882dfd 100644 --- a/agents/libhttpagent.go +++ b/agents/libhttpagent.go @@ -86,7 +86,7 @@ func (hU *httpUrlDP) FieldAsString(fldPath []string) (data string, err error) { if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } @@ -136,7 +136,7 @@ func (hU *httpXmlDP) FieldAsInterface(fldPath []string) (data interface{}, err e } err = nil // cancel previous err var slctrStr string - for i, _ := range fldPath { + for i := range fldPath { if sIdx := strings.Index(fldPath[i], "["); sIdx != -1 { slctrStr = fldPath[i][sIdx:] if slctrStr[len(slctrStr)-1:] != "]" { @@ -172,7 +172,7 @@ func (hU *httpXmlDP) FieldAsString(fldPath []string) (data string, err error) { if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/agents/librad.go b/agents/librad.go index 1dee40fba..3ec9a50e6 100644 --- a/agents/librad.go +++ b/agents/librad.go @@ -177,7 +177,7 @@ func (pk *radiusDP) FieldAsString(fldPath []string) (data string, err error) { if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/cdrc/csv.go b/cdrc/csv.go index d3a0655d7..351d91c76 100644 --- a/cdrc/csv.go +++ b/cdrc/csv.go @@ -263,7 +263,7 @@ func (cP *csvProvider) FieldAsString(fldPath []string) (data string, err error) if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/cdrc/fwv.go b/cdrc/fwv.go index c30fa986d..a43f6c085 100644 --- a/cdrc/fwv.go +++ b/cdrc/fwv.go @@ -312,7 +312,7 @@ func (fP *fwvProvider) FieldAsString(fldPath []string) (data string, err error) if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/cdrc/xml.go b/cdrc/xml.go index e60525c8b..484a79a7a 100644 --- a/cdrc/xml.go +++ b/cdrc/xml.go @@ -247,7 +247,7 @@ func (xP *xmlProvider) FieldAsString(fldPath []string) (data string, err error) if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/config/navigablemap.go b/config/navigablemap.go index 52f7784a1..b43522947 100644 --- a/config/navigablemap.go +++ b/config/navigablemap.go @@ -119,8 +119,7 @@ func (nM *NavigableMap) FieldAsString(fldPath []string) (fldVal string, err erro if err != nil { return } - var canCast bool - if fldVal, canCast = utils.CastFieldIfToString(valIface); !canCast { + if fldVal, err = utils.IfaceAsString(valIface); err != nil { return "", fmt.Errorf("cannot cast field: %s to string", utils.ToJSON(valIface)) } return @@ -243,8 +242,8 @@ func (nM *NavigableMap) AsXMLElements() (ents []*XMLElement, err error) { if nmItm.Config != nil && nmItm.Config.NewBranch { pathIdx = make(map[string]*XMLElement) // reset cache so we can start having other elements with same path } - val, canCast := utils.CastFieldIfToString(nmItm.Data) - if !canCast { + val, err := utils.IfaceAsString(nmItm.Data) + if err != nil { return nil, fmt.Errorf("cannot cast value: <%s> to string", utils.ToJSON(nmItm.Data)) } diff --git a/engine/action.go b/engine/action.go index 161a22623..9f2649017 100644 --- a/engine/action.go +++ b/engine/action.go @@ -353,7 +353,7 @@ func disableAccountAction(acc *Account, sq *CDRStatsQueueTriggered, a *Action, a }*/ func genericReset(ub *Account) error { - for k, _ := range ub.BalanceMap { + for k := range ub.BalanceMap { ub.BalanceMap[k] = Balances{&Balance{Value: 0}} } ub.InitCounters() @@ -884,7 +884,7 @@ func (cdrP *cdrLogProvider) FieldAsString(fldPath []string) (data string, err er if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/engine/filterhelpers.go b/engine/filterhelpers.go index 2daa31a1f..535003b48 100644 --- a/engine/filterhelpers.go +++ b/engine/filterhelpers.go @@ -69,8 +69,8 @@ func matchingItemIDsForEvent(ev map[string]interface{}, stringFldIDs, prefixFldI continue } if _, cached := stringFieldVals[fldName]; !cached { - strVal, canCast := utils.CastFieldIfToString(fieldValIf) - if !canCast { + strVal, err := utils.IfaceAsString(fieldValIf) + if err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> cannot cast field: %s into string", utils.FilterS, fldName)) continue diff --git a/loaders/libloader.go b/loaders/libloader.go index bcbceb9ea..b8b95c94e 100644 --- a/loaders/libloader.go +++ b/loaders/libloader.go @@ -126,7 +126,7 @@ func (cP *csvProvider) FieldAsString(fldPath []string) (data string, err error) if err != nil { return } - data, _ = utils.CastFieldIfToString(valIface) + data, err = utils.IfaceAsString(valIface) return } diff --git a/utils/cgrevent.go b/utils/cgrevent.go index 8caa1c6a5..1c2aecb12 100644 --- a/utils/cgrevent.go +++ b/utils/cgrevent.go @@ -54,8 +54,8 @@ func (ev *CGREvent) FieldAsString(fldName string) (val string, err error) { if !has { return "", ErrNotFound } - val, canCast := CastFieldIfToString(iface) - if !canCast { + val, err = IfaceAsString(iface) + if err != nil { return "", fmt.Errorf("cannot cast %s to string", fldName) } return val, nil diff --git a/utils/dataconverter.go b/utils/dataconverter.go index 1f6f7e084..dd80c30d0 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -37,9 +37,8 @@ func (dcs DataConverters) ConvertString(in string) (out string, err error) { return } } - var canCast bool - out, canCast = CastFieldIfToString(outIface) - if !canCast { + out, err = IfaceAsString(outIface) + if err != nil { return "", NewErrStringCast(outIface) } return diff --git a/utils/reflect.go b/utils/reflect.go index 35b85f58a..abd00bbe0 100644 --- a/utils/reflect.go +++ b/utils/reflect.go @@ -26,43 +26,6 @@ import ( "time" ) -func CastFieldIfToString(fld interface{}) (string, bool) { - if fld == nil { - return "", true - } - var strVal string - var converted bool - switch fld.(type) { - case int: - strVal = strconv.Itoa(fld.(int)) - converted = true - case int64: - strVal = strconv.FormatInt(fld.(int64), 10) - converted = true - case bool: - strVal = strconv.FormatBool(fld.(bool)) - converted = true - case float64: - strVal = strconv.FormatFloat(fld.(float64), 'f', -1, 64) - converted = true - case []uint8: - var byteVal []byte - if byteVal, converted = fld.([]byte); converted { - strVal = string(byteVal) - } - case time.Duration: - strVal = fld.(time.Duration).String() - converted = true - case string: - strVal = fld.(string) - converted = true - default: // Maybe we are lucky and the value converts to string - strVal = ToJSON(fld) - converted = true - } - return strVal, converted -} - // StringToInterface will parse string into supported types // if no other conversion possible, original string will be returned func StringToInterface(s string) interface{} { @@ -142,12 +105,11 @@ func ReflectFieldAsString(intf interface{}, fldName, extraFieldsLabel string) (s case reflect.Float64: return strconv.FormatFloat(vOf.Float(), 'f', -1, 64), nil case reflect.Interface: - strVal, converted := CastFieldIfToString(field) - if !converted { + strVal, err := IfaceAsString(field) + if err != nil { return "", fmt.Errorf("Cannot convert to string field type: %s", vOf.Kind().String()) - } else { - return strVal, nil } + return strVal, nil default: return "", fmt.Errorf("Cannot convert to string field type: %s", vOf.Kind().String()) } diff --git a/utils/reflect_test.go b/utils/reflect_test.go index 1b6a9c100..502bc0adf 100644 --- a/utils/reflect_test.go +++ b/utils/reflect_test.go @@ -223,30 +223,40 @@ func TestStringToInterface(t *testing.T) { } } -func TestCastFieldIfToString(t *testing.T) { +func TestIfaceAsString(t *testing.T) { val := interface{}("string1") - if resVal, converted := CastFieldIfToString(val); !converted || resVal != "string1" { - t.Error(resVal, converted) + if rply, err := IfaceAsString(val); err != nil { + t.Error(err) + } else if rply != "string1" { + t.Errorf("Expeced string1 ,recived %+v", rply) } val = interface{}(123) - if resVal, converted := CastFieldIfToString(val); !converted || resVal != "123" { - t.Error(resVal, converted) + if rply, err := IfaceAsString(val); err != nil { + t.Error(err) + } else if rply != "123" { + t.Errorf("Expeced 123 ,recived %+v", rply) } val = interface{}([]byte("byte_val")) - if resVal, converted := CastFieldIfToString(val); !converted || resVal != "byte_val" { - t.Error(resVal, converted) + if rply, err := IfaceAsString(val); err != nil { + t.Error(err) + } else if rply != "byte_val" { + t.Errorf("Expeced byte_val ,recived %+v", rply) } val = interface{}(true) - if resVal, converted := CastFieldIfToString(val); !converted || resVal != "true" { - t.Error(resVal, converted) + if rply, err := IfaceAsString(val); err != nil { + t.Error(err) + } else if rply != "true" { + t.Errorf("Expeced true ,recived %+v", rply) } - if strVal, cast := CastFieldIfToString(time.Duration(1 * time.Second)); !cast { - t.Error("cannot cast time.Duration") - } else if strVal != "1s" { - t.Errorf("received: %s", strVal) + if rply, err := IfaceAsString(time.Duration(1 * time.Second)); err != nil { + t.Error(err) + } else if rply != "1s" { + t.Errorf("Expeced 1s ,recived %+v", rply) } - if resVal, converted := CastIfToString(nil); converted || resVal != "" { - t.Errorf("received: %s", resVal) + if rply, err := IfaceAsString(nil); err != nil { + t.Error(err) + } else if rply != "" { + t.Errorf("Expeced ,recived %+v", rply) } } diff --git a/utils/struct.go b/utils/struct.go index 1aa755316..12579d799 100644 --- a/utils/struct.go +++ b/utils/struct.go @@ -288,7 +288,7 @@ func UpdateStructWithIfaceMap(s interface{}, mp map[string]interface{}) (err err fld.SetFloat(valFlt) } case reflect.String: - if valStr, canCast := CastFieldIfToString(val); !canCast { + if valStr, err := IfaceAsString(val); err != nil { return fmt.Errorf("cannot convert field: %+v to string", val) } else { fld.SetString(valStr)