Files
weatherreporter/internal/report/registry.go

92 lines
2.2 KiB
Go

package report
import (
"fmt"
"gitea.maximumdirect.net/eric/weatherreporter/internal/module"
)
type Registry struct {
definitions map[ID]Definition
}
func DefaultRegistry() Registry {
definitions := []Definition{
dailyDefinition(),
todayDefinition(),
tomorrowDefinition(),
hourlyDefinition(),
threeDayDefinition(),
weekendDefinition(),
stormDefinition(),
}
registry := Registry{definitions: map[ID]Definition{}}
for _, definition := range definitions {
registry.definitions[definition.ID] = definition
}
return registry
}
func (r Registry) WithModuleOverrides(overrides map[ID][]module.ConfigItem) (Registry, error) {
next := Registry{definitions: map[ID]Definition{}}
for id, definition := range r.definitions {
next.definitions[id] = cloneDefinition(definition)
}
for id, items := range overrides {
definition, ok := next.definitions[id]
if !ok {
return Registry{}, fmt.Errorf("unknown report %q", id)
}
definition.Modules = cloneModuleItems(items)
next.definitions[id] = definition
}
return next, nil
}
func cloneDefinition(definition Definition) Definition {
definition.Modules = cloneModuleItems(definition.Modules)
definition.DistributorPathTemplates = append([]string(nil), definition.DistributorPathTemplates...)
return definition
}
func moduleItems(ids ...module.ID) []module.ConfigItem {
items := make([]module.ConfigItem, 0, len(ids))
for _, id := range ids {
items = append(items, module.ConfigItem{ID: id})
}
return items
}
func cloneModuleItems(items []module.ConfigItem) []module.ConfigItem {
cloned := make([]module.ConfigItem, len(items))
copy(cloned, items)
return cloned
}
func (r Registry) Lookup(id ID) (Definition, error) {
definition, ok := r.definitions[id]
if !ok {
return Definition{}, fmt.Errorf("unknown report %q", id)
}
return definition, nil
}
func (r Registry) MustLookup(id ID) Definition {
definition, err := r.Lookup(id)
if err != nil {
panic(err)
}
return definition
}
func (r Registry) All() []Definition {
ids := []ID{Daily, Today, Tomorrow, Hourly, ThreeDay, Weekend, Storm}
out := make([]Definition, 0, len(ids))
for _, id := range ids {
if definition, ok := r.definitions[id]; ok {
out = append(out, definition)
}
}
return out
}