67 lines
1.3 KiB
Go
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]
|
|
}
|