123 lines
3.0 KiB
Go
123 lines
3.0 KiB
Go
// 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,
|
|
}
|
|
}
|