diff --git a/plugin/ifelse.go b/plugin/ifelse.go new file mode 100644 index 000000000..0d49d2d1f --- /dev/null +++ b/plugin/ifelse.go @@ -0,0 +1,78 @@ +package plugin + +import ( + "context" + + "github.com/evcc-io/evcc/util" +) + +type ifElsePlugin struct { + ctx context.Context + i, e Config +} + +func init() { + registry.AddCtx("ifelse", NewIfElseFromConfig) +} + +// NewIfElseFromConfig creates ifElse provider +func NewIfElseFromConfig(ctx context.Context, other map[string]any) (Plugin, error) { + var cc struct { + I Config `mapstructure:"if"` + E Config `mapstructure:"else"` + } + + if err := util.DecodeOther(other, &cc); err != nil { + return nil, err + } + + o := &ifElsePlugin{ + ctx: ctx, + i: cc.I, + e: cc.E, + } + + return o, nil +} + +var _ IntSetter = (*ifElsePlugin)(nil) + +func (o *ifElsePlugin) IntSetter(param string) (func(int64) error, error) { + ifS, err := o.i.IntSetter(o.ctx, param) + if err != nil { + return nil, err + } + + elseS, err := o.e.IntSetter(o.ctx, param) + if err != nil { + return nil, err + } + + return func(val int64) error { + if val > 0 { + return ifS(val) + } + return elseS(val) + }, nil +} + +var _ BoolSetter = (*ifElsePlugin)(nil) + +func (o *ifElsePlugin) BoolSetter(param string) (func(bool) error, error) { + ifS, err := o.i.BoolSetter(o.ctx, param) + if err != nil { + return nil, err + } + + elseS, err := o.e.BoolSetter(o.ctx, param) + if err != nil { + return nil, err + } + + return func(val bool) error { + if val { + return ifS(val) + } + return elseS(val) + }, nil +}