From b6631cc9d5479f35365dac9aac3e18bf098224bb Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 30 Jan 2022 13:26:08 +0100 Subject: [PATCH] Calc: support multiplication (#2444) --- provider/calc.go | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/provider/calc.go b/provider/calc.go index dcf1e504e..cd0651d37 100644 --- a/provider/calc.go +++ b/provider/calc.go @@ -1,13 +1,14 @@ package provider import ( + "errors" "fmt" "github.com/evcc-io/evcc/util" ) type calcProvider struct { - add []func() (float64, error) + add, mul []func() (float64, error) } func init() { @@ -18,6 +19,7 @@ func init() { func NewCalcFromConfig(other map[string]interface{}) (IntProvider, error) { cc := struct { Add []Config + Mul []Config }{} if err := util.DecodeOther(other, &cc); err != nil { @@ -26,6 +28,10 @@ func NewCalcFromConfig(other map[string]interface{}) (IntProvider, error) { o := &calcProvider{} + if len(cc.Add) > 0 && len(cc.Mul) > 0 { + return nil, errors.New("can only have either add or mul") + } + for idx, cc := range cc.Add { f, err := NewFloatGetterFromConfig(cc) if err != nil { @@ -34,6 +40,14 @@ func NewCalcFromConfig(other map[string]interface{}) (IntProvider, error) { o.add = append(o.add, f) } + for idx, cc := range cc.Mul { + f, err := NewFloatGetterFromConfig(cc) + if err != nil { + return nil, fmt.Errorf("mul[%d]: %w", idx, err) + } + o.mul = append(o.mul, f) + } + return o, nil } @@ -56,14 +70,26 @@ func (o *calcProvider) FloatGetter() func() (float64, error) { } func (o *calcProvider) floatGetter() (float64, error) { - var sum float64 - for idx, p := range o.add { - v, err := p() - if err != nil { - return 0, fmt.Errorf("add[%d]: %w", idx, err) + var res float64 + + if len(o.mul) > 0 { + res = 1 + for idx, p := range o.mul { + v, err := p() + if err != nil { + return 0, fmt.Errorf("mul[%d]: %w", idx, err) + } + res *= v + } + } else { + for idx, p := range o.add { + v, err := p() + if err != nil { + return 0, fmt.Errorf("add[%d]: %w", idx, err) + } + res += v } - sum += v } - return sum, nil + return res, nil }