From 0f4ac37dda9c315f305122e62fbae0faee0f60bd Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 28 May 2018 14:57:49 +0200 Subject: [PATCH] New DataConverter *multiply --- utils/consts.go | 2 ++ utils/dataconverter.go | 33 +++++++++++++++++++++ utils/dataconverter_test.go | 22 ++++++++++++++ utils/errors.go | 57 +++++++++++++++++++------------------ 4 files changed, 86 insertions(+), 28 deletions(-) diff --git a/utils/consts.go b/utils/consts.go index 86d8234b9..050048a9c 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -537,6 +537,8 @@ const ( Opensips = "opensips" Asterisk = "asterisk" SchedulerS = "SchedulerS" + MetaMultiply = "*multiply" + MetaDivide = "*divide" ) // Migrator Action diff --git a/utils/dataconverter.go b/utils/dataconverter.go index ffb662fec..cfc3c7e75 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -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 +} diff --git a/utils/dataconverter_test.go b/utils/dataconverter_test.go index c2742ff14..b5c0c50f7 100644 --- a/utils/dataconverter_test.go +++ b/utils/dataconverter_test.go @@ -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) + } +} diff --git a/utils/errors.go b/utils/errors.go index 10e3e75bb..9d8a4eadb 100644 --- a/utils/errors.go +++ b/utils/errors.go @@ -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