evcc-io/api/impl.go
2022-12-23 10:52:54 +01:00

67 lines
1.3 KiB
Go

package api
import (
"encoding"
"errors"
"fmt"
"strings"
"time"
)
// ChargeModeString converts string to ChargeMode
func ChargeModeString(mode string) (ChargeMode, error) {
switch strings.ToLower(mode) {
case string(ModeEmpty):
return ModeEmpty, nil // undefined
case string(ModeNow):
return ModeNow, nil
case string(ModeMinPV):
return ModeMinPV, nil
case string(ModePV):
return ModePV, nil
case string(ModeOff):
return ModeOff, nil
default:
return "", fmt.Errorf("invalid value: %s", mode)
}
}
var _ encoding.TextUnmarshaler = (*ChargeMode)(nil)
func (c *ChargeMode) UnmarshalText(text []byte) error {
casted, err := ChargeModeString(string(text))
if err != nil {
return err
}
*c = casted
return nil
}
// Current returns the rates current rate or error
func (r Rates) Current(now time.Time) (Rate, error) {
for _, rr := range r {
if (rr.Start.Before(now) || rr.Start.Equal(now)) && rr.End.After(now) {
return rr, nil
}
}
return Rate{}, errors.New("no matching rate")
}
// implement sort.Interface
func (r Rates) Len() int {
return len(r)
}
func (r Rates) Less(i, j int) bool {
if r[i].Price == r[j].Price {
return r[i].Start.After(r[j].Start)
}
return r[i].Price < r[j].Price
}
func (r Rates) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}