40 lines
824 B
Go
40 lines
824 B
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"slices"
|
|
"time"
|
|
)
|
|
|
|
// Rate is a grid tariff rate
|
|
type Rate struct {
|
|
Start time.Time `json:"start"`
|
|
End time.Time `json:"end"`
|
|
Price float64 `json:"price"`
|
|
}
|
|
|
|
// IsEmpty returns is the rate is the zero value
|
|
func (r Rate) IsEmpty() bool {
|
|
return r.Start.IsZero() && r.End.IsZero() && r.Price == 0
|
|
}
|
|
|
|
// Rates is a slice of (future) tariff rates
|
|
type Rates []Rate
|
|
|
|
// Sort rates by start time
|
|
func (r Rates) Sort() {
|
|
slices.SortStableFunc(r, func(i, j Rate) int {
|
|
return i.Start.Compare(j.Start)
|
|
})
|
|
}
|
|
|
|
// 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")
|
|
}
|