71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package report
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func Resolve(id ID, req ResolveRequest) (Resolved, error) {
|
|
return DefaultRegistry().Resolve(id, req)
|
|
}
|
|
|
|
func (r Registry) Resolve(id ID, req ResolveRequest) (Resolved, error) {
|
|
definition, err := r.Lookup(id)
|
|
if err != nil {
|
|
return Resolved{}, err
|
|
}
|
|
return r.resolveDefinition(definition, req)
|
|
}
|
|
|
|
func (r Registry) BatchReports(batch Batch, req ResolveRequest) ([]Resolved, error) {
|
|
if req.Location == nil {
|
|
req.Location = time.UTC
|
|
}
|
|
if req.Now.IsZero() {
|
|
req.Now = time.Now()
|
|
}
|
|
switch batch {
|
|
case Morning:
|
|
ids := []ID{Today, ThreeDay}
|
|
if req.Now.In(req.Location).Weekday() != time.Sunday {
|
|
ids = append(ids, Weekend)
|
|
}
|
|
return r.resolveIDs(ids, req)
|
|
case Evening:
|
|
return r.resolveIDs([]ID{Tomorrow}, req)
|
|
default:
|
|
return nil, fmt.Errorf("unknown batch %q", batch)
|
|
}
|
|
}
|
|
|
|
func (r Registry) resolveIDs(ids []ID, req ResolveRequest) ([]Resolved, error) {
|
|
resolved := make([]Resolved, 0, len(ids))
|
|
for _, id := range ids {
|
|
item, err := r.Resolve(id, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resolved = append(resolved, item)
|
|
}
|
|
return resolved, nil
|
|
}
|
|
|
|
func (r Registry) resolveDefinition(definition Definition, req ResolveRequest) (Resolved, error) {
|
|
if req.Location == nil {
|
|
req.Location = time.UTC
|
|
}
|
|
if req.Now.IsZero() {
|
|
req.Now = time.Now()
|
|
}
|
|
period, err := definition.ResolvePeriod(req)
|
|
if err != nil {
|
|
return Resolved{}, err
|
|
}
|
|
return Resolved{
|
|
Definition: definition,
|
|
GeneratedAt: req.Now,
|
|
Timezone: req.Location.String(),
|
|
ValidPeriod: period,
|
|
}, nil
|
|
}
|