evcc-io/plugin/const.go

163 lines
3 KiB
Go

package plugin
import (
"context"
"encoding/hex"
"strconv"
"strings"
"github.com/evcc-io/evcc/plugin/pipeline"
"github.com/evcc-io/evcc/util"
)
type constPlugin struct {
ctx context.Context
str string
set Config
}
func init() {
registry.AddCtx("const", NewConstFromConfig)
}
// NewConstFromConfig creates const provider
func NewConstFromConfig(ctx context.Context, other map[string]interface{}) (Plugin, error) {
var cc struct {
Value string
pipeline.Settings `mapstructure:",squash"`
Set Config
}
if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}
p := &constPlugin{
ctx: ctx,
str: cc.Value,
set: cc.Set,
}
return p, nil
}
var _ StringGetter = (*constPlugin)(nil)
func (p *constPlugin) StringGetter() (func() (string, error), error) {
return func() (string, error) {
return p.str, nil
}, nil
}
var _ IntGetter = (*constPlugin)(nil)
func (p *constPlugin) IntGetter() (func() (int64, error), error) {
val, err := strconv.ParseInt(p.str, 10, 64)
if err != nil && p.str == "" {
err = nil
}
return func() (int64, error) {
return val, err
}, err
}
var _ FloatGetter = (*constPlugin)(nil)
func (p *constPlugin) FloatGetter() (func() (float64, error), error) {
val, err := strconv.ParseFloat(p.str, 64)
if err != nil && p.str == "" {
err = nil
}
return func() (float64, error) {
return val, err
}, err
}
var _ BoolGetter = (*constPlugin)(nil)
func (p *constPlugin) BoolGetter() (func() (bool, error), error) {
val, err := strconv.ParseBool(p.str)
if err != nil && p.str == "" {
err = nil
}
return func() (bool, error) {
return val, err
}, err
}
var _ IntSetter = (*constPlugin)(nil)
func (p *constPlugin) IntSetter(param string) (func(int64) error, error) {
set, err := p.set.IntSetter(p.ctx, param)
if err != nil {
return nil, err
}
val, err := strconv.ParseInt(p.str, 10, 64)
if err != nil && p.str == "" {
err = nil
}
return func(_ int64) error {
return set(val)
}, err
}
var _ FloatSetter = (*constPlugin)(nil)
func (p *constPlugin) FloatSetter(param string) (func(float64) error, error) {
set, err := p.set.FloatSetter(p.ctx, param)
if err != nil {
return nil, err
}
val, err := strconv.ParseFloat(p.str, 64)
if err != nil && p.str == "" {
err = nil
}
return func(_ float64) error {
return set(val)
}, err
}
var _ BoolSetter = (*constPlugin)(nil)
func (p *constPlugin) BoolSetter(param string) (func(bool) error, error) {
set, err := p.set.BoolSetter(p.ctx, param)
if err != nil {
return nil, err
}
val, err := strconv.ParseBool(p.str)
if err != nil && p.str == "" {
err = nil
}
return func(_ bool) error {
return set(val)
}, err
}
var _ BytesSetter = (*constPlugin)(nil)
func (p *constPlugin) BytesSetter(param string) (func([]byte) error, error) {
set, err := p.set.BytesSetter(p.ctx, param)
if err != nil {
return nil, err
}
str := strings.ReplaceAll(strings.TrimPrefix(p.str, "0x"), "_", "")
val, err := hex.DecodeString(str)
if err != nil {
err = nil
}
return func(_ []byte) error {
return set(val)
}, err
}