chore: simplify implementing decorators (#28576)
This commit is contained in:
parent
a2ce340210
commit
4b21185219
148 changed files with 1500 additions and 6358 deletions
57
api/implement/caps.go
Normal file
57
api/implement/caps.go
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
package implement
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"github.com/evcc-io/evcc/api"
|
||||
)
|
||||
|
||||
// Has registers impl as a capability on c. It panics if impl is nil.
|
||||
func Has[T any](c Caps, impl T) {
|
||||
typ := reflect.TypeFor[T]()
|
||||
if isNil(impl) {
|
||||
panic("implement: nil " + typ.String())
|
||||
}
|
||||
c.add(typ, impl)
|
||||
}
|
||||
|
||||
// May registers impl as a capability on c. If impl is nil, it is silently ignored.
|
||||
func May[T any](c Caps, impl T) {
|
||||
if isNil(impl) {
|
||||
return
|
||||
}
|
||||
c.add(reflect.TypeFor[T](), impl)
|
||||
}
|
||||
|
||||
func isNil(v any) bool {
|
||||
if v == nil {
|
||||
return true
|
||||
}
|
||||
switch rv := reflect.ValueOf(v); rv.Kind() {
|
||||
case reflect.Pointer, reflect.Interface, reflect.Map, reflect.Slice, reflect.Chan, reflect.Func:
|
||||
return rv.IsNil()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type Caps interface {
|
||||
api.Capable
|
||||
add(typ reflect.Type, impl any)
|
||||
}
|
||||
|
||||
// New creates a capabilities store exposing the api.Capable interface
|
||||
func New() Caps {
|
||||
return make(caps)
|
||||
}
|
||||
|
||||
type caps map[reflect.Type]any
|
||||
|
||||
// Capability implements the api.Capable interface
|
||||
func (caps caps) Capability(typ reflect.Type) (any, bool) {
|
||||
c, ok := caps[typ]
|
||||
return c, ok
|
||||
}
|
||||
|
||||
func (caps caps) add(typ reflect.Type, impl any) {
|
||||
caps[typ] = impl
|
||||
}
|
||||
81
api/implement/caps_test.go
Normal file
81
api/implement/caps_test.go
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
package implement
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/evcc-io/evcc/api"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type isCapable struct {
|
||||
Caps
|
||||
}
|
||||
|
||||
func TestHas(t *testing.T) {
|
||||
s := &isCapable{
|
||||
Caps: New(),
|
||||
}
|
||||
|
||||
Has(s, Meter(func() (float64, error) {
|
||||
return 0, nil
|
||||
}))
|
||||
|
||||
mm, ok := api.Cap[api.Meter](s)
|
||||
assert.True(t, ok)
|
||||
|
||||
v, err := mm.CurrentPower()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 0.0, v)
|
||||
}
|
||||
|
||||
func TestHasPanicsOnNil(t *testing.T) {
|
||||
s := &isCapable{
|
||||
Caps: New(),
|
||||
}
|
||||
|
||||
assert.Panics(t, func() {
|
||||
Has[api.Meter](s, nil)
|
||||
})
|
||||
}
|
||||
|
||||
func TestMayIgnoresNil(t *testing.T) {
|
||||
s := &isCapable{
|
||||
Caps: New(),
|
||||
}
|
||||
|
||||
assert.NotPanics(t, func() {
|
||||
May[api.Meter](s, nil)
|
||||
})
|
||||
|
||||
_, ok := api.Cap[api.Meter](s)
|
||||
assert.False(t, ok)
|
||||
}
|
||||
|
||||
func TestMayRegistersNonNil(t *testing.T) {
|
||||
s := &isCapable{
|
||||
Caps: New(),
|
||||
}
|
||||
|
||||
May(s, Meter(func() (float64, error) {
|
||||
return 1.0, nil
|
||||
}))
|
||||
|
||||
mm, ok := api.Cap[api.Meter](s)
|
||||
assert.True(t, ok)
|
||||
|
||||
v, err := mm.CurrentPower()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1.0, v)
|
||||
}
|
||||
|
||||
func TestMayIgnoresNilFuncConstructor(t *testing.T) {
|
||||
s := &isCapable{
|
||||
Caps: New(),
|
||||
}
|
||||
|
||||
var fn func() (float64, error)
|
||||
May(s, Meter(fn))
|
||||
|
||||
_, ok := api.Cap[api.Meter](s)
|
||||
assert.False(t, ok)
|
||||
}
|
||||
449
api/implement/implementations.go
Normal file
449
api/implement/implementations.go
Normal file
|
|
@ -0,0 +1,449 @@
|
|||
package implement
|
||||
|
||||
// Code generated by github.com/evcc-io/evcc/api/implement/caps.go. DO NOT EDIT.
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/evcc-io/evcc/api"
|
||||
)
|
||||
|
||||
func Meter(meter0 func() (float64, error)) api.Meter {
|
||||
if meter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iMeter{meter0}
|
||||
}
|
||||
|
||||
type iMeter struct {
|
||||
meter0 func() (float64, error)
|
||||
}
|
||||
|
||||
func (i *iMeter) CurrentPower() (float64, error) {
|
||||
return i.meter0()
|
||||
}
|
||||
|
||||
func BatteryCapacity(batteryCapacity0 func() float64) api.BatteryCapacity {
|
||||
if batteryCapacity0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iBatteryCapacity{batteryCapacity0}
|
||||
}
|
||||
|
||||
type iBatteryCapacity struct {
|
||||
batteryCapacity0 func() float64
|
||||
}
|
||||
|
||||
func (i *iBatteryCapacity) Capacity() float64 {
|
||||
return i.batteryCapacity0()
|
||||
}
|
||||
|
||||
func SocLimiter(socLimiter0 func() (int64, error)) api.SocLimiter {
|
||||
if socLimiter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iSocLimiter{socLimiter0}
|
||||
}
|
||||
|
||||
type iSocLimiter struct {
|
||||
socLimiter0 func() (int64, error)
|
||||
}
|
||||
|
||||
func (i *iSocLimiter) GetLimitSoc() (int64, error) {
|
||||
return i.socLimiter0()
|
||||
}
|
||||
|
||||
func BatteryController(batteryController0 func(api.BatteryMode) error) api.BatteryController {
|
||||
if batteryController0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iBatteryController{batteryController0}
|
||||
}
|
||||
|
||||
type iBatteryController struct {
|
||||
batteryController0 func(api.BatteryMode) error
|
||||
}
|
||||
|
||||
func (i *iBatteryController) SetBatteryMode(p0 api.BatteryMode) error {
|
||||
return i.batteryController0(p0)
|
||||
}
|
||||
|
||||
func BatterySocLimiter(batterySocLimiter0 func() (float64, float64)) api.BatterySocLimiter {
|
||||
if batterySocLimiter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iBatterySocLimiter{batterySocLimiter0}
|
||||
}
|
||||
|
||||
type iBatterySocLimiter struct {
|
||||
batterySocLimiter0 func() (float64, float64)
|
||||
}
|
||||
|
||||
func (i *iBatterySocLimiter) GetSocLimits() (float64, float64) {
|
||||
return i.batterySocLimiter0()
|
||||
}
|
||||
|
||||
func BatteryPowerLimiter(batteryPowerLimiter0 func() (float64, float64)) api.BatteryPowerLimiter {
|
||||
if batteryPowerLimiter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iBatteryPowerLimiter{batteryPowerLimiter0}
|
||||
}
|
||||
|
||||
type iBatteryPowerLimiter struct {
|
||||
batteryPowerLimiter0 func() (float64, float64)
|
||||
}
|
||||
|
||||
func (i *iBatteryPowerLimiter) GetPowerLimits() (float64, float64) {
|
||||
return i.batteryPowerLimiter0()
|
||||
}
|
||||
|
||||
func PhasePowers(phasePowers0 func() (float64, float64, float64, error)) api.PhasePowers {
|
||||
if phasePowers0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iPhasePowers{phasePowers0}
|
||||
}
|
||||
|
||||
type iPhasePowers struct {
|
||||
phasePowers0 func() (float64, float64, float64, error)
|
||||
}
|
||||
|
||||
func (i *iPhasePowers) Powers() (float64, float64, float64, error) {
|
||||
return i.phasePowers0()
|
||||
}
|
||||
|
||||
func PhaseGetter(phaseGetter0 func() (int, error)) api.PhaseGetter {
|
||||
if phaseGetter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iPhaseGetter{phaseGetter0}
|
||||
}
|
||||
|
||||
type iPhaseGetter struct {
|
||||
phaseGetter0 func() (int, error)
|
||||
}
|
||||
|
||||
func (i *iPhaseGetter) GetPhases() (int, error) {
|
||||
return i.phaseGetter0()
|
||||
}
|
||||
|
||||
func ChargeController(chargeController0 func(bool) error) api.ChargeController {
|
||||
if chargeController0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iChargeController{chargeController0}
|
||||
}
|
||||
|
||||
type iChargeController struct {
|
||||
chargeController0 func(bool) error
|
||||
}
|
||||
|
||||
func (i *iChargeController) ChargeEnable(p0 bool) error {
|
||||
return i.chargeController0(p0)
|
||||
}
|
||||
|
||||
func CurrentController(currentController0 func(int64) error) api.CurrentController {
|
||||
if currentController0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iCurrentController{currentController0}
|
||||
}
|
||||
|
||||
type iCurrentController struct {
|
||||
currentController0 func(int64) error
|
||||
}
|
||||
|
||||
func (i *iCurrentController) MaxCurrent(p0 int64) error {
|
||||
return i.currentController0(p0)
|
||||
}
|
||||
|
||||
func PhaseSwitcher(phaseSwitcher0 func(int) error) api.PhaseSwitcher {
|
||||
if phaseSwitcher0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iPhaseSwitcher{phaseSwitcher0}
|
||||
}
|
||||
|
||||
type iPhaseSwitcher struct {
|
||||
phaseSwitcher0 func(int) error
|
||||
}
|
||||
|
||||
func (i *iPhaseSwitcher) Phases1p3p(p0 int) error {
|
||||
return i.phaseSwitcher0(p0)
|
||||
}
|
||||
|
||||
func Battery(battery0 func() (float64, error)) api.Battery {
|
||||
if battery0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iBattery{battery0}
|
||||
}
|
||||
|
||||
type iBattery struct {
|
||||
battery0 func() (float64, error)
|
||||
}
|
||||
|
||||
func (i *iBattery) Soc() (float64, error) {
|
||||
return i.battery0()
|
||||
}
|
||||
|
||||
func ChargeState(chargeState0 func() (api.ChargeStatus, error)) api.ChargeState {
|
||||
if chargeState0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iChargeState{chargeState0}
|
||||
}
|
||||
|
||||
type iChargeState struct {
|
||||
chargeState0 func() (api.ChargeStatus, error)
|
||||
}
|
||||
|
||||
func (i *iChargeState) Status() (api.ChargeStatus, error) {
|
||||
return i.chargeState0()
|
||||
}
|
||||
|
||||
func MeterEnergy(meterEnergy0 func() (float64, error)) api.MeterEnergy {
|
||||
if meterEnergy0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iMeterEnergy{meterEnergy0}
|
||||
}
|
||||
|
||||
type iMeterEnergy struct {
|
||||
meterEnergy0 func() (float64, error)
|
||||
}
|
||||
|
||||
func (i *iMeterEnergy) TotalEnergy() (float64, error) {
|
||||
return i.meterEnergy0()
|
||||
}
|
||||
|
||||
func PhaseCurrents(phaseCurrents0 func() (float64, float64, float64, error)) api.PhaseCurrents {
|
||||
if phaseCurrents0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iPhaseCurrents{phaseCurrents0}
|
||||
}
|
||||
|
||||
type iPhaseCurrents struct {
|
||||
phaseCurrents0 func() (float64, float64, float64, error)
|
||||
}
|
||||
|
||||
func (i *iPhaseCurrents) Currents() (float64, float64, float64, error) {
|
||||
return i.phaseCurrents0()
|
||||
}
|
||||
|
||||
func PhaseVoltages(phaseVoltages0 func() (float64, float64, float64, error)) api.PhaseVoltages {
|
||||
if phaseVoltages0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iPhaseVoltages{phaseVoltages0}
|
||||
}
|
||||
|
||||
type iPhaseVoltages struct {
|
||||
phaseVoltages0 func() (float64, float64, float64, error)
|
||||
}
|
||||
|
||||
func (i *iPhaseVoltages) Voltages() (float64, float64, float64, error) {
|
||||
return i.phaseVoltages0()
|
||||
}
|
||||
|
||||
func MaxACPowerGetter(maxACPowerGetter0 func() float64) api.MaxACPowerGetter {
|
||||
if maxACPowerGetter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iMaxACPowerGetter{maxACPowerGetter0}
|
||||
}
|
||||
|
||||
type iMaxACPowerGetter struct {
|
||||
maxACPowerGetter0 func() float64
|
||||
}
|
||||
|
||||
func (i *iMaxACPowerGetter) MaxACPower() float64 {
|
||||
return i.maxACPowerGetter0()
|
||||
}
|
||||
|
||||
func CurrentGetter(currentGetter0 func() (float64, error)) api.CurrentGetter {
|
||||
if currentGetter0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iCurrentGetter{currentGetter0}
|
||||
}
|
||||
|
||||
type iCurrentGetter struct {
|
||||
currentGetter0 func() (float64, error)
|
||||
}
|
||||
|
||||
func (i *iCurrentGetter) GetMaxCurrent() (float64, error) {
|
||||
return i.currentGetter0()
|
||||
}
|
||||
|
||||
func Curtailer(curtailer0 func(bool) error, curtailer1 func() (bool, error)) api.Curtailer {
|
||||
if curtailer0 == nil || curtailer1 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iCurtailer{curtailer0, curtailer1}
|
||||
}
|
||||
|
||||
type iCurtailer struct {
|
||||
curtailer0 func(bool) error
|
||||
curtailer1 func() (bool, error)
|
||||
}
|
||||
|
||||
func (i *iCurtailer) Curtail(p0 bool) error {
|
||||
return i.curtailer0(p0)
|
||||
}
|
||||
|
||||
func (i *iCurtailer) Curtailed() (bool, error) {
|
||||
return i.curtailer1()
|
||||
}
|
||||
|
||||
func Resurrector(resurrector0 func() error) api.Resurrector {
|
||||
if resurrector0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iResurrector{resurrector0}
|
||||
}
|
||||
|
||||
type iResurrector struct {
|
||||
resurrector0 func() error
|
||||
}
|
||||
|
||||
func (i *iResurrector) WakeUp() error {
|
||||
return i.resurrector0()
|
||||
}
|
||||
|
||||
func VehicleOdometer(vehicleOdometer0 func() (float64, error)) api.VehicleOdometer {
|
||||
if vehicleOdometer0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iVehicleOdometer{vehicleOdometer0}
|
||||
}
|
||||
|
||||
type iVehicleOdometer struct {
|
||||
vehicleOdometer0 func() (float64, error)
|
||||
}
|
||||
|
||||
func (i *iVehicleOdometer) Odometer() (float64, error) {
|
||||
return i.vehicleOdometer0()
|
||||
}
|
||||
|
||||
func VehicleRange(vehicleRange0 func() (int64, error)) api.VehicleRange {
|
||||
if vehicleRange0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iVehicleRange{vehicleRange0}
|
||||
}
|
||||
|
||||
type iVehicleRange struct {
|
||||
vehicleRange0 func() (int64, error)
|
||||
}
|
||||
|
||||
func (i *iVehicleRange) Range() (int64, error) {
|
||||
return i.vehicleRange0()
|
||||
}
|
||||
|
||||
func VehicleClimater(vehicleClimater0 func() (bool, error)) api.VehicleClimater {
|
||||
if vehicleClimater0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iVehicleClimater{vehicleClimater0}
|
||||
}
|
||||
|
||||
type iVehicleClimater struct {
|
||||
vehicleClimater0 func() (bool, error)
|
||||
}
|
||||
|
||||
func (i *iVehicleClimater) Climater() (bool, error) {
|
||||
return i.vehicleClimater0()
|
||||
}
|
||||
|
||||
func VehicleFinishTimer(vehicleFinishTimer0 func() (time.Time, error)) api.VehicleFinishTimer {
|
||||
if vehicleFinishTimer0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iVehicleFinishTimer{vehicleFinishTimer0}
|
||||
}
|
||||
|
||||
type iVehicleFinishTimer struct {
|
||||
vehicleFinishTimer0 func() (time.Time, error)
|
||||
}
|
||||
|
||||
func (i *iVehicleFinishTimer) FinishTime() (time.Time, error) {
|
||||
return i.vehicleFinishTimer0()
|
||||
}
|
||||
|
||||
func VehiclePosition(vehiclePosition0 func() (float64, float64, error)) api.VehiclePosition {
|
||||
if vehiclePosition0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iVehiclePosition{vehiclePosition0}
|
||||
}
|
||||
|
||||
type iVehiclePosition struct {
|
||||
vehiclePosition0 func() (float64, float64, error)
|
||||
}
|
||||
|
||||
func (i *iVehiclePosition) Position() (float64, float64, error) {
|
||||
return i.vehiclePosition0()
|
||||
}
|
||||
|
||||
func Identifier(identifier0 func() (string, error)) api.Identifier {
|
||||
if identifier0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iIdentifier{identifier0}
|
||||
}
|
||||
|
||||
type iIdentifier struct {
|
||||
identifier0 func() (string, error)
|
||||
}
|
||||
|
||||
func (i *iIdentifier) Identify() (string, error) {
|
||||
return i.identifier0()
|
||||
}
|
||||
|
||||
func ChargerEx(chargerEx0 func(float64) error) api.ChargerEx {
|
||||
if chargerEx0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iChargerEx{chargerEx0}
|
||||
}
|
||||
|
||||
type iChargerEx struct {
|
||||
chargerEx0 func(float64) error
|
||||
}
|
||||
|
||||
func (i *iChargerEx) MaxCurrentMillis(p0 float64) error {
|
||||
return i.chargerEx0(p0)
|
||||
}
|
||||
|
||||
func ChargeRater(chargeRater0 func() (float64, error)) api.ChargeRater {
|
||||
if chargeRater0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iChargeRater{chargeRater0}
|
||||
}
|
||||
|
||||
type iChargeRater struct {
|
||||
chargeRater0 func() (float64, error)
|
||||
}
|
||||
|
||||
func (i *iChargeRater) ChargedEnergy() (float64, error) {
|
||||
return i.chargeRater0()
|
||||
}
|
||||
|
||||
func StatusReasoner(statusReasoner0 func() (api.Reason, error)) api.StatusReasoner {
|
||||
if statusReasoner0 == nil {
|
||||
return nil
|
||||
}
|
||||
return &iStatusReasoner{statusReasoner0}
|
||||
}
|
||||
|
||||
type iStatusReasoner struct {
|
||||
statusReasoner0 func() (api.Reason, error)
|
||||
}
|
||||
|
||||
func (i *iStatusReasoner) StatusReason() (api.Reason, error) {
|
||||
return i.statusReasoner0()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue