diff --git a/utils/dataconverter.go b/utils/dataconverter.go index cfc3c7e75..01361f313 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -66,6 +66,11 @@ func NewDataConverter(params string) ( return NewMultiplyConverter("") } return NewMultiplyConverter(params[len(MetaMultiply)+1:]) + case strings.HasPrefix(params, MetaDivide): + if len(params) == len(MetaDivide) { // no extra params, defaults implied + return NewDivideConverter("") + } + return NewDivideConverter(params[len(MetaDivide)+1:]) default: return nil, fmt.Errorf("unsupported converter definition: <%s>", @@ -159,3 +164,31 @@ func (m *MultiplyConverter) Convert(in interface{}) ( out = inFloat64 * m.Value return } + +func NewDivideConverter(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 &DivideConverter{Value: val}, nil +} + +// DivideConverter divides input with value in params +// encapsulates the output as float64 value +type DivideConverter struct { + Value float64 +} + +func (m *DivideConverter) 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 b5c0c50f7..b2beb2697 100644 --- a/utils/dataconverter_test.go +++ b/utils/dataconverter_test.go @@ -38,7 +38,7 @@ func TestNewDataConverter(t *testing.T) { } func TestConvertFloatToSeconds(t *testing.T) { - b, err := NewDurationSecondsConverter("") + b, err := NewDataConverter(MetaDurationSeconds) if err != nil { t.Error(err.Error()) } @@ -53,7 +53,7 @@ func TestConvertFloatToSeconds(t *testing.T) { } func TestRoundConverterFloat64(t *testing.T) { - b, err := NewRoundConverter("2") + b, err := NewDataConverter("*round:2") if err != nil { t.Error(err.Error()) } @@ -77,7 +77,7 @@ func TestRoundConverterFloat64(t *testing.T) { //testRoundconv string / float / int / time func TestRoundConverterString(t *testing.T) { - b, err := NewRoundConverter("2") + b, err := NewDataConverter("*round:2") if err != nil { t.Error(err.Error()) } @@ -99,7 +99,7 @@ func TestRoundConverterString(t *testing.T) { } func TestRoundConverterInt64(t *testing.T) { - b, err := NewRoundConverter("2") + b, err := NewDataConverter("*round:2") if err != nil { t.Error(err.Error()) } @@ -121,7 +121,7 @@ func TestRoundConverterInt64(t *testing.T) { } func TestRoundConverterTime(t *testing.T) { - b, err := NewRoundConverter("2") + b, err := NewDataConverter("*round:2") if err != nil { t.Error(err.Error()) } @@ -144,7 +144,7 @@ func TestRoundConverterTime(t *testing.T) { func TestMultiplyConverter(t *testing.T) { eMpl := &MultiplyConverter{1024.0} - m, err := NewMultiplyConverter("1024.0") + m, err := NewDataConverter("*multiply:1024.0") if err != nil { t.Error(err) } else if !reflect.DeepEqual(eMpl, m) { @@ -163,3 +163,25 @@ func TestMultiplyConverter(t *testing.T) { t.Errorf("expecting: %+v, received: %+v", expOut, out) } } + +func TestDivideConverter(t *testing.T) { + eDvd := &DivideConverter{1024.0} + d, err := NewDataConverter("*divide:1024.0") + if err != nil { + t.Error(err) + } else if !reflect.DeepEqual(eDvd, d) { + t.Errorf("expecting: %+v, received: %+v", eDvd, d) + } + expOut := 2.0 + if out, err := d.Convert(time.Duration(2048)); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expOut, out) { + t.Errorf("expecting: %+v, received: %+v", expOut, out) + } + expOut = 1.5 + if out, err := d.Convert(1536.0); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expOut, out) { + t.Errorf("expecting: %+v, received: %+v", expOut, out) + } +}