// Package report defines report identities, registry metadata, and valid periods. package report import ( "fmt" "time" "gitea.maximumdirect.net/eric/weatherreporter/internal/module" "gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil" ) type ID string const ( Daily ID = "daily" Today ID = "today" Tomorrow ID = "tomorrow" Hourly ID = "hourly" ThreeDay ID = "three_day" Weekend ID = "weekend" Storm ID = "storm" ) type ComparisonStrategy string const ( CompareSameValidDate ComparisonStrategy = "same_valid_date" CompareWeekendWindow ComparisonStrategy = "same_weekend_window" CompareExplicitWindow ComparisonStrategy = "explicit_event_window" CompareRollingWindow ComparisonStrategy = "rolling_window" ) type GenerationMode string const ( GenerationModeScriptoriumMarkdown GenerationMode = "scriptorium_markdown" GenerationModeGeneratedTextTemplate GenerationMode = "generated_text_template" ) type Batch string const ( Morning Batch = "morning" Evening Batch = "evening" ) type Definition struct { ID ID Name string PromptID string GenerationMode GenerationMode TemplateID string GeneratedTextSchemaID string ComparisonStrategy ComparisonStrategy ArtifactGroup string BatchOutputName string Generated bool CompatiblePriorIDs []ID Modules []module.ConfigItem Morning bool Evening bool resolve func(ResolveRequest) (timeutil.Period, error) } func (d Definition) ResolvePeriod(req ResolveRequest) (timeutil.Period, error) { if d.resolve == nil { return timeutil.Period{}, fmt.Errorf("report %q has no valid-period resolver", d.ID) } return d.resolve(req) } func (d Definition) CompatibleWithPrior(id ID) bool { for _, compatibleID := range d.CompatiblePriorIDs { if id == compatibleID { return true } } return false } func (d Definition) ModuleIDs() []module.ID { ids := make([]module.ID, 0, len(d.Modules)) for _, item := range d.Modules { ids = append(ids, item.ID) } return ids } type ResolveRequest struct { Now time.Time Location *time.Location Date time.Time StormStart time.Time StormEnd time.Time } type Resolved struct { Definition Definition GeneratedAt time.Time Timezone string ValidPeriod timeutil.Period } type Metadata struct { RunID string `json:"runId"` ReportID ID `json:"reportId"` PromptID string `json:"promptId"` GeneratedAt time.Time `json:"generatedAt"` Timezone string `json:"timezone"` ValidPeriod timeutil.Period `json:"validPeriod"` } func (r Resolved) Metadata() Metadata { return Metadata{ RunID: r.GeneratedAt.UTC().Format("20060102T150405.000000000Z") + "_" + string(r.Definition.ID), ReportID: r.Definition.ID, PromptID: r.Definition.PromptID, GeneratedAt: r.GeneratedAt, Timezone: r.Timezone, ValidPeriod: r.ValidPeriod, } }