Replace CastFieldIfToString with IfaceAsString

This commit is contained in:
Trial97
2018-10-02 11:40:52 +03:00
committed by Dan Christian Bogos
parent acc5925972
commit 1741cca805
16 changed files with 65 additions and 86 deletions

View File

@@ -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
}
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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))
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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())
}

View File

@@ -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)
}
}

View File

@@ -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)