package state import ( "time" "gitea.maximumdirect.net/eric/weatherreporter/internal/briefing" "gitea.maximumdirect.net/eric/weatherreporter/internal/forecast" "gitea.maximumdirect.net/eric/weatherreporter/internal/report" "gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil" ) const MetadataSchemaVersion = "weatherreporter.metadata.v1" type Metadata struct { SchemaVersion string `json:"schemaVersion"` RunID string `json:"runId"` MetadataPath string `json:"-"` ReportID report.ID `json:"reportId"` Variant string `json:"variant,omitempty"` PromptID string `json:"promptId"` GeneratedAt time.Time `json:"generatedAt"` Timezone string `json:"timezone"` ValidPeriod timeutil.Period `json:"validPeriod"` Location *briefing.LocationContext `json:"location,omitempty"` SourceLocationID string `json:"sourceLocationId,omitempty"` SourceLocation string `json:"sourceLocation,omitempty"` Sources []briefing.SourceMetadata `json:"sources,omitempty"` SourceWarnings []forecast.SourceWarning `json:"sourceWarnings,omitempty"` BriefingPath string `json:"briefingPath"` DataPackagePath string `json:"dataPackagePath"` PreflightPath string `json:"preflightPath"` RenderedReportPath string `json:"renderedReportPath,omitempty"` } func BuildMetadata(resolved report.Resolved, briefingPackage briefing.Package, paths ArtifactPaths) Metadata { metadata := resolved.Metadata() return Metadata{ SchemaVersion: MetadataSchemaVersion, RunID: metadata.RunID, MetadataPath: paths.Metadata, ReportID: metadata.ReportID, Variant: briefingPackage.Metadata.Variant, PromptID: metadata.PromptID, GeneratedAt: metadata.GeneratedAt, Timezone: metadata.Timezone, ValidPeriod: metadata.ValidPeriod, Location: copyLocation(briefingPackage.Metadata.Location), SourceLocationID: briefingPackage.Metadata.SourceLocationID, SourceLocation: briefingPackage.Metadata.SourceLocation, Sources: briefingPackage.Metadata.Sources, SourceWarnings: briefingPackage.Metadata.SourceWarnings, BriefingPath: paths.Briefing, DataPackagePath: paths.DataPackage, PreflightPath: paths.Preflight, RenderedReportPath: paths.RenderedReport, } } func copyLocation(location *briefing.LocationContext) *briefing.LocationContext { if location == nil { return nil } copied := *location return &copied }