Validate fact requirements through briefing vocabulary

This commit is contained in:
2026-08-13 04:02:21 +00:00
parent 2c4c0bbd90
commit 71b7a74d3d
4 changed files with 167 additions and 93 deletions

View File

@@ -8,8 +8,9 @@ const (
)
type factRequirement struct {
identity string
category factRequirementCategory
identity string
category factRequirementCategory
available func(ModuleContext) bool
}
func (r factRequirement) String() string {
@@ -17,25 +18,55 @@ func (r factRequirement) String() string {
}
var (
currentConditionsRequirement = factRequirement{identity: "collected.current_conditions", category: collectedFactRequirement}
narrativeForecastRequirement = factRequirement{identity: "collected.narrative_forecast", category: collectedFactRequirement}
hourlyForecastRequirement = factRequirement{identity: "collected.hourly_forecast", category: collectedFactRequirement}
alertsRequirement = factRequirement{identity: "collected.alerts", category: collectedFactRequirement}
discussionRequirement = factRequirement{identity: "collected.discussion", category: collectedFactRequirement}
weatherStoryRequirement = factRequirement{identity: "collected.weather_story", category: collectedFactRequirement}
spcOutlooksRequirement = factRequirement{identity: "collected.spc_convective_outlooks", category: collectedFactRequirement}
sourceMetadataRequirement = factRequirement{identity: "collected.source_metadata", category: collectedFactRequirement}
currentConditionsRequirement = &factRequirement{identity: "collected.current_conditions", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.Current != nil
}}
narrativeForecastRequirement = &factRequirement{identity: "collected.narrative_forecast", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.Narrative != nil
}}
hourlyForecastRequirement = &factRequirement{identity: "collected.hourly_forecast", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.Hourly != nil
}}
alertsRequirement = &factRequirement{identity: "collected.alerts", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.Alerts != nil
}}
discussionRequirement = &factRequirement{identity: "collected.discussion", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.Discussion != nil
}}
weatherStoryRequirement = &factRequirement{identity: "collected.weather_story", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.WeatherStory != nil
}}
spcOutlooksRequirement = &factRequirement{identity: "collected.spc_convective_outlooks", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Collected.SPCConvectiveOutlooks != nil
}}
sourceMetadataRequirement = &factRequirement{identity: "collected.source_metadata", category: collectedFactRequirement, available: func(ctx ModuleContext) bool {
return len(ctx.Collected.SourceProvenance) > 0 || len(ctx.Collected.SourceWarnings) > 0
}}
hourlyPeriodsRequirement = factRequirement{identity: "derived.hourly_periods", category: derivedFactRequirement}
narrativePeriodsRequirement = factRequirement{identity: "derived.narrative_periods", category: derivedFactRequirement}
alertOverlapsRequirement = factRequirement{identity: "derived.alert_overlaps", category: derivedFactRequirement}
dailySummariesRequirement = factRequirement{identity: "derived.daily_summaries", category: derivedFactRequirement}
daypartSummariesRequirement = factRequirement{identity: "derived.daypart_summaries", category: derivedFactRequirement}
precipTimingRequirement = factRequirement{identity: "derived.precip_timing", category: derivedFactRequirement}
spcDerivedOutlooksRequirement = factRequirement{identity: "derived.spc_convective_outlooks", category: derivedFactRequirement}
hourlyPeriodsRequirement = &factRequirement{identity: "derived.hourly_periods", category: derivedFactRequirement, available: func(ctx ModuleContext) bool {
return len(ctx.Derived.ValidPeriodHourlyPeriods) > 0
}}
narrativePeriodsRequirement = &factRequirement{identity: "derived.narrative_periods", category: derivedFactRequirement, available: func(ctx ModuleContext) bool {
return len(ctx.Derived.ValidPeriodNarrativePeriods) > 0
}}
alertOverlapsRequirement = &factRequirement{identity: "derived.alert_overlaps", category: derivedFactRequirement, available: func(ModuleContext) bool {
return true
}}
dailySummariesRequirement = &factRequirement{identity: "derived.daily_summaries", category: derivedFactRequirement, available: func(ctx ModuleContext) bool {
return len(ctx.Derived.DailySummaries) > 0
}}
daypartSummariesRequirement = &factRequirement{identity: "derived.daypart_summaries", category: derivedFactRequirement, available: func(ctx ModuleContext) bool {
return len(ctx.Derived.DaypartSummaries) > 0
}}
precipTimingRequirement = &factRequirement{identity: "derived.precip_timing", category: derivedFactRequirement, available: func(ModuleContext) bool {
return true
}}
spcDerivedOutlooksRequirement = &factRequirement{identity: "derived.spc_convective_outlooks", category: derivedFactRequirement, available: func(ctx ModuleContext) bool {
return ctx.Derived.SPCConvectiveOutlooks != nil
}}
)
var factRequirementVocabulary = []factRequirement{
var factRequirementVocabulary = []*factRequirement{
currentConditionsRequirement,
narrativeForecastRequirement,
hourlyForecastRequirement,