Define briefing fact requirement vocabulary

This commit is contained in:
2026-08-13 03:59:09 +00:00
parent 965f16d7a4
commit 2c4c0bbd90
5 changed files with 146 additions and 73 deletions

View File

@@ -28,8 +28,8 @@ type ModuleDefinition struct {
ID module.ID
StanzaName string
DefaultOptions any
RequiredCollected []module.FactRequirement
RequiredDerived []module.FactRequirement
RequiredCollected []factRequirement
RequiredDerived []factRequirement
SupportedReports []report.ID
MissingData module.MissingDataBehavior
AllowDuplicate bool
@@ -154,55 +154,55 @@ func missingRequirements(definition ModuleDefinition, ctx ModuleContext) []strin
var missing []string
for _, requirement := range definition.RequiredCollected {
if !collectedFactAvailable(requirement, ctx) {
missing = append(missing, string(requirement))
missing = append(missing, requirement.String())
}
}
for _, requirement := range definition.RequiredDerived {
if !derivedFactAvailable(requirement, ctx) {
missing = append(missing, string(requirement))
missing = append(missing, requirement.String())
}
}
return missing
}
func collectedFactAvailable(requirement module.FactRequirement, ctx ModuleContext) bool {
func collectedFactAvailable(requirement factRequirement, ctx ModuleContext) bool {
switch requirement {
case module.CollectedCurrentConditions:
case currentConditionsRequirement:
return ctx.Collected.Current != nil
case module.CollectedNarrativeForecast:
case narrativeForecastRequirement:
return ctx.Collected.Narrative != nil
case module.CollectedHourlyForecast:
case hourlyForecastRequirement:
return ctx.Collected.Hourly != nil
case module.CollectedAlerts:
case alertsRequirement:
return ctx.Collected.Alerts != nil
case module.CollectedDiscussion:
case discussionRequirement:
return ctx.Collected.Discussion != nil
case module.CollectedWeatherStory:
case weatherStoryRequirement:
return ctx.Collected.WeatherStory != nil
case module.CollectedSPCConvectiveOutlooks:
case spcOutlooksRequirement:
return ctx.Collected.SPCConvectiveOutlooks != nil
case module.CollectedSourceMetadata:
case sourceMetadataRequirement:
return len(ctx.Collected.SourceProvenance) > 0 || len(ctx.Collected.SourceWarnings) > 0
default:
return false
}
}
func derivedFactAvailable(requirement module.FactRequirement, ctx ModuleContext) bool {
func derivedFactAvailable(requirement factRequirement, ctx ModuleContext) bool {
switch requirement {
case module.RequiresDerivedHourlyPeriods:
case hourlyPeriodsRequirement:
return len(ctx.Derived.ValidPeriodHourlyPeriods) > 0
case module.RequiresDerivedNarrativePeriods:
case narrativePeriodsRequirement:
return len(ctx.Derived.ValidPeriodNarrativePeriods) > 0
case module.RequiresDerivedAlertOverlaps:
case alertOverlapsRequirement:
return true
case module.RequiresDerivedDailySummaries:
case dailySummariesRequirement:
return len(ctx.Derived.DailySummaries) > 0
case module.RequiresDerivedDaypartSummaries:
case daypartSummariesRequirement:
return len(ctx.Derived.DaypartSummaries) > 0
case module.RequiresDerivedPrecipTiming:
case precipTimingRequirement:
return true
case module.RequiresDerivedSPCConvectiveOutlooks:
case spcDerivedOutlooksRequirement:
return ctx.Derived.SPCConvectiveOutlooks != nil
default:
return false
@@ -291,7 +291,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.Metadata,
StanzaName: "metadata",
DefaultOptions: module.MetadataOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedSourceMetadata},
RequiredCollected: []factRequirement{sourceMetadataRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataEmpty,
Builder: buildMetadataModule,
@@ -300,7 +300,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.CurrentConditions,
StanzaName: "current_conditions",
DefaultOptions: module.CurrentConditionsOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedCurrentConditions},
RequiredCollected: []factRequirement{currentConditionsRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataOmit,
Builder: buildCurrentConditionsModule,
@@ -310,8 +310,8 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.NarrativeForecast,
StanzaName: "narrative_forecast",
DefaultOptions: module.NarrativeForecastOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedNarrativeForecast},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedNarrativePeriods},
RequiredCollected: []factRequirement{narrativeForecastRequirement},
RequiredDerived: []factRequirement{narrativePeriodsRequirement},
SupportedReports: []report.ID{report.Daily, report.Today, report.Tomorrow},
MissingData: module.MissingDataOmit,
Builder: buildNarrativeForecastModule,
@@ -320,8 +320,8 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.HourlyForecast,
StanzaName: "hourly_forecast",
DefaultOptions: module.HourlyForecastOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedHourlyForecast},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedHourlyPeriods},
RequiredCollected: []factRequirement{hourlyForecastRequirement},
RequiredDerived: []factRequirement{hourlyPeriodsRequirement},
SupportedReports: []report.ID{report.Daily, report.Today, report.Tomorrow, report.Hourly},
MissingData: module.MissingDataOmit,
Builder: buildHourlyForecastModule,
@@ -331,7 +331,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.DerivedDailySummary,
StanzaName: "derived_daily_summary",
DefaultOptions: module.DerivedDailySummaryOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedDailySummaries, module.RequiresDerivedPrecipTiming},
RequiredDerived: []factRequirement{dailySummariesRequirement, precipTimingRequirement},
SupportedReports: []report.ID{report.Daily, report.Today, report.Tomorrow},
MissingData: module.MissingDataError,
Builder: buildDerivedDailySummaryModule,
@@ -340,7 +340,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.DerivedDaypartSummaries,
StanzaName: "derived_daypart_summaries",
DefaultOptions: module.DerivedDaypartSummariesOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedDaypartSummaries},
RequiredDerived: []factRequirement{daypartSummariesRequirement},
SupportedReports: daypartReports,
MissingData: module.MissingDataError,
Builder: buildDerivedDaypartSummariesModule,
@@ -350,7 +350,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.PrecipTiming,
StanzaName: "precip_timing",
DefaultOptions: module.PrecipTimingOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedPrecipTiming},
RequiredDerived: []factRequirement{precipTimingRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataEmpty,
Builder: buildPrecipTimingModule,
@@ -359,8 +359,8 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.AlertDigest,
StanzaName: "alert_digest",
DefaultOptions: module.AlertDigestOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedAlerts},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedAlertOverlaps},
RequiredCollected: []factRequirement{alertsRequirement},
RequiredDerived: []factRequirement{alertOverlapsRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataEmpty,
Builder: buildAlertDigestModule,
@@ -369,8 +369,8 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.SPCConvectiveOutlooks,
StanzaName: string(module.SPCConvectiveOutlooks),
DefaultOptions: module.SPCConvectiveOutlooksOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedSPCConvectiveOutlooks},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedSPCConvectiveOutlooks},
RequiredCollected: []factRequirement{spcOutlooksRequirement},
RequiredDerived: []factRequirement{spcDerivedOutlooksRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataEmpty,
Builder: buildSPCConvectiveOutlooksModule,
@@ -379,7 +379,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.AreaForecastDiscussion,
StanzaName: "area_forecast_discussion",
DefaultOptions: module.AreaForecastDiscussionOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedDiscussion},
RequiredCollected: []factRequirement{discussionRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataOmit,
Builder: buildAreaForecastDiscussionModule,
@@ -388,8 +388,8 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.SPCConvectiveDiscussion,
StanzaName: string(module.SPCConvectiveDiscussion),
DefaultOptions: module.SPCConvectiveDiscussionOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedSPCConvectiveOutlooks},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedSPCConvectiveOutlooks},
RequiredCollected: []factRequirement{spcOutlooksRequirement},
RequiredDerived: []factRequirement{spcDerivedOutlooksRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataOmit,
Builder: buildSPCConvectiveDiscussionModule,
@@ -398,7 +398,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.WeatherStory,
StanzaName: "weather_story",
DefaultOptions: module.WeatherStoryOptions{},
RequiredCollected: []module.FactRequirement{module.CollectedWeatherStory},
RequiredCollected: []factRequirement{weatherStoryRequirement},
SupportedReports: allReports,
MissingData: module.MissingDataOmit,
Builder: buildWeatherStoryModule,
@@ -407,7 +407,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.OutdoorWindows,
StanzaName: "outdoor_windows",
DefaultOptions: module.OutdoorWindowsOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedDaypartSummaries},
RequiredDerived: []factRequirement{daypartSummariesRequirement},
SupportedReports: daypartReports,
MissingData: module.MissingDataEmpty,
Builder: buildOutdoorWindowsModule,
@@ -416,7 +416,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.TodayPlanning,
StanzaName: "today_planning",
DefaultOptions: module.TodayPlanningOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedDailySummaries},
RequiredDerived: []factRequirement{dailySummariesRequirement},
SupportedReports: []report.ID{report.Today},
MissingData: module.MissingDataEmpty,
Builder: buildTodayPlanningModule,
@@ -425,7 +425,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.TomorrowPlanning,
StanzaName: "tomorrow_planning",
DefaultOptions: module.TomorrowPlanningOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedDailySummaries},
RequiredDerived: []factRequirement{dailySummariesRequirement},
SupportedReports: []report.ID{report.Tomorrow},
MissingData: module.MissingDataEmpty,
Builder: buildTomorrowPlanningModule,
@@ -434,7 +434,7 @@ func defaultModuleDefinitions() []ModuleDefinition {
ID: module.DailyPlanning,
StanzaName: "daily_planning",
DefaultOptions: module.DailyPlanningOptions{},
RequiredDerived: []module.FactRequirement{module.RequiresDerivedDailySummaries},
RequiredDerived: []factRequirement{dailySummariesRequirement},
SupportedReports: []report.ID{report.Daily},
MissingData: module.MissingDataEmpty,
Builder: buildDailyPlanningModule,