Ctrl K
ComunidadGuías…

tariff/proxy.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package tariff

import (
	"context"
	"slices"

	"github.com/evcc-io/evcc/api"
	"github.com/evcc-io/evcc/util"
)

// NewProxyFromConfig creates a tariff proxy supporting average or caching
func NewProxyFromConfig(ctx context.Context, typ string, other map[string]any) (api.Tariff, error) {
	var embed struct {
		Features []api.Feature  `mapstructure:"features"`
		Other    map[string]any `mapstructure:",remain"`
	}

	if err := util.DecodeOther(other, &embed); err != nil {
		return nil, err
	}

	updateFeatures := func(f api.Feature) {
		features := slices.DeleteFunc(embed.Features, func(feat api.Feature) bool {
			return feat == f
		})

		if len(features) > 0 {
			embed.Other["features"] = features
		} else {
			delete(embed.Other, "features")
		}
	}

	if slices.Contains(embed.Features, api.Average) {
		updateFeatures(api.Average)
		t, err := NewFromConfig(ctx, typ, embed.Other)
		if err != nil {
			return nil, err
		}
		return NewAverageProxy(t)
	}

	if slices.Contains(embed.Features, api.Cacheable) {
		updateFeatures(api.Cacheable)
		return NewCachedFromConfig(ctx, typ, embed.Other)
	}

	return NewFromConfig(ctx, typ, other)
}