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 }