New DataConverter *multiply

This commit is contained in:
DanB
2018-05-28 14:57:49 +02:00
parent d9f0e43a33
commit 0f4ac37dda
4 changed files with 86 additions and 28 deletions

View File

@@ -537,6 +537,8 @@ const (
Opensips = "opensips"
Asterisk = "asterisk"
SchedulerS = "SchedulerS"
MetaMultiply = "*multiply"
MetaDivide = "*divide"
)
// Migrator Action

View File

@@ -61,6 +61,11 @@ func NewDataConverter(params string) (
return NewRoundConverter("")
}
return NewRoundConverter(params[len(MetaRound)+1:])
case strings.HasPrefix(params, MetaMultiply):
if len(params) == len(MetaMultiply) { // no extra params, defaults implied
return NewMultiplyConverter("")
}
return NewMultiplyConverter(params[len(MetaMultiply)+1:])
default:
return nil,
fmt.Errorf("unsupported converter definition: <%s>",
@@ -126,3 +131,31 @@ func (rnd *RoundConverter) Convert(in interface{}) (
out = Round(inFloat, rnd.Decimals, rnd.Method)
return
}
func NewMultiplyConverter(constructParams string) (
hdlr DataConverter, err error) {
if constructParams == "" {
return nil, ErrMandatoryIeMissingNoCaps
}
var val float64
if val, err = strconv.ParseFloat(constructParams, 64); err != nil {
return
}
return &MultiplyConverter{Value: val}, nil
}
// MultiplyConverter multiplies input with value in params
// encapsulates the output as float64 value
type MultiplyConverter struct {
Value float64
}
func (m *MultiplyConverter) Convert(in interface{}) (
out interface{}, err error) {
var inFloat64 float64
if inFloat64, err = IfaceAsFloat64(in); err != nil {
return nil, err
}
out = inFloat64 * m.Value
return
}

View File

@@ -141,3 +141,25 @@ func TestRoundConverterTime(t *testing.T) {
t.Errorf("Expected %+v received: %+v", expV, val)
}
}
func TestMultiplyConverter(t *testing.T) {
eMpl := &MultiplyConverter{1024.0}
m, err := NewMultiplyConverter("1024.0")
if err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eMpl, m) {
t.Errorf("expecting: %+v, received: %+v", eMpl, m)
}
expOut := 2048.0
if out, err := m.Convert(time.Duration(2)); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expOut, out) {
t.Errorf("expecting: %+v, received: %+v", expOut, out)
}
expOut = 1536.0
if out, err := m.Convert(1.5); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expOut, out) {
t.Errorf("expecting: %+v, received: %+v", expOut, out)
}
}

View File

@@ -24,34 +24,35 @@ import (
)
var (
ErrNoMoreData = errors.New("NO_MORE_DATA")
ErrNotImplemented = errors.New("NOT_IMPLEMENTED")
ErrNotFound = errors.New("NOT_FOUND")
ErrTimedOut = errors.New("TIMED_OUT")
ErrServerError = errors.New("SERVER_ERROR")
ErrMaxRecursionDepth = errors.New("MAX_RECURSION_DEPTH")
ErrMandatoryIeMissing = errors.New("MANDATORY_IE_MISSING")
ErrExists = errors.New("EXISTS")
ErrBrokenReference = errors.New("BROKEN_REFERENCE")
ErrParserError = errors.New("PARSER_ERROR")
ErrInvalidPath = errors.New("INVALID_PATH")
ErrInvalidKey = errors.New("INVALID_KEY")
ErrUnauthorizedDestination = errors.New("UNAUTHORIZED_DESTINATION")
ErrRatingPlanNotFound = errors.New("RATING_PLAN_NOT_FOUND")
ErrAccountNotFound = errors.New("ACCOUNT_NOT_FOUND")
ErrAccountDisabled = errors.New("ACCOUNT_DISABLED")
ErrUserNotFound = errors.New("USER_NOT_FOUND")
ErrInsufficientCredit = errors.New("INSUFFICIENT_CREDIT")
ErrNotConvertible = errors.New("NOT_CONVERTIBLE")
ErrResourceUnavailable = errors.New("RESOURCE_UNAVAILABLE")
ErrResourceUnauthorized = errors.New("RESOURCE_UNAUTHORIZED")
ErrNoActiveSession = errors.New("NO_ACTIVE_SESSION")
ErrPartiallyExecuted = errors.New("PARTIALLY_EXECUTED")
ErrMaxUsageExceeded = errors.New("MAX_USAGE_EXCEEDED")
ErrUnallocatedResource = errors.New("UNALLOCATED_RESOURCE")
ErrNotFoundNoCaps = errors.New("not found")
ErrFilterNotPassingNoCaps = errors.New("filter not passing")
ErrNotConvertibleNoCaps = errors.New("not convertible")
ErrNoMoreData = errors.New("NO_MORE_DATA")
ErrNotImplemented = errors.New("NOT_IMPLEMENTED")
ErrNotFound = errors.New("NOT_FOUND")
ErrTimedOut = errors.New("TIMED_OUT")
ErrServerError = errors.New("SERVER_ERROR")
ErrMaxRecursionDepth = errors.New("MAX_RECURSION_DEPTH")
ErrMandatoryIeMissing = errors.New("MANDATORY_IE_MISSING")
ErrExists = errors.New("EXISTS")
ErrBrokenReference = errors.New("BROKEN_REFERENCE")
ErrParserError = errors.New("PARSER_ERROR")
ErrInvalidPath = errors.New("INVALID_PATH")
ErrInvalidKey = errors.New("INVALID_KEY")
ErrUnauthorizedDestination = errors.New("UNAUTHORIZED_DESTINATION")
ErrRatingPlanNotFound = errors.New("RATING_PLAN_NOT_FOUND")
ErrAccountNotFound = errors.New("ACCOUNT_NOT_FOUND")
ErrAccountDisabled = errors.New("ACCOUNT_DISABLED")
ErrUserNotFound = errors.New("USER_NOT_FOUND")
ErrInsufficientCredit = errors.New("INSUFFICIENT_CREDIT")
ErrNotConvertible = errors.New("NOT_CONVERTIBLE")
ErrResourceUnavailable = errors.New("RESOURCE_UNAVAILABLE")
ErrResourceUnauthorized = errors.New("RESOURCE_UNAUTHORIZED")
ErrNoActiveSession = errors.New("NO_ACTIVE_SESSION")
ErrPartiallyExecuted = errors.New("PARTIALLY_EXECUTED")
ErrMaxUsageExceeded = errors.New("MAX_USAGE_EXCEEDED")
ErrUnallocatedResource = errors.New("UNALLOCATED_RESOURCE")
ErrNotFoundNoCaps = errors.New("not found")
ErrFilterNotPassingNoCaps = errors.New("filter not passing")
ErrNotConvertibleNoCaps = errors.New("not convertible")
ErrMandatoryIeMissingNoCaps = errors.New("mandatory information missing")
)
// NewCGRError initialises a new CGRError