evcc-io/plugin/valid.go
2025-06-10 15:11:01 +02:00

90 lines
1.8 KiB
Go

package plugin
import (
"context"
"fmt"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
)
func init() {
registry.AddCtx("valid", NewValidFromConfig)
}
// validPlugin validates a reading via a second reading
type validPlugin struct {
ctx context.Context
valid func() (bool, error)
value Config
}
// NewValidFromConfig creates valid provider
func NewValidFromConfig(ctx context.Context, other map[string]interface{}) (Plugin, error) {
var cc struct {
Valid, Value Config
}
if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}
valid, err := cc.Valid.BoolGetter(ctx)
if err != nil {
return nil, fmt.Errorf("valid: %w", err)
}
o := NewValidPlugin(ctx, valid, cc.Value)
return o, nil
}
// NewValidPlugin creates valid provider
func NewValidPlugin(ctx context.Context, valid func() (bool, error), value Config) *validPlugin {
return &validPlugin{
ctx: ctx,
valid: valid,
value: value,
}
}
var _ StringGetter = (*validPlugin)(nil)
func validGetter[T any](o *validPlugin, valuer func(ctx context.Context) (func() (T, error), error)) (func() (T, error), error) {
value, err := valuer(o.ctx)
if err != nil {
return nil, fmt.Errorf("valid: %w", err)
}
return func() (T, error) {
var zero T
valid, err := o.valid()
if err != nil {
return zero, err
}
if !valid {
return zero, api.ErrNotAvailable
}
return value()
}, nil
}
var _ StringGetter = (*validPlugin)(nil)
func (o *validPlugin) StringGetter() (func() (string, error), error) {
return validGetter(o, o.value.StringGetter)
}
var _ FloatGetter = (*validPlugin)(nil)
func (o *validPlugin) FloatGetter() (func() (float64, error), error) {
return validGetter(o, o.value.FloatGetter)
}
var _ IntGetter = (*validPlugin)(nil)
func (o *validPlugin) IntGetter() (func() (int64, error), error) {
return validGetter(o, o.value.IntGetter)
}