package cli import ( "time" "gitea.maximumdirect.net/eric/weatherreporter/internal/app" "gitea.maximumdirect.net/eric/weatherreporter/internal/report" "gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil" "gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata" ) const ( commandGenerate = "generate" commandRun = "run" summaryStatusSucceeded = "succeeded" summaryStatusFailed = "failed" ) type generateSummary struct { Command string `json:"command"` ReportID report.ID `json:"reportId"` ReportName string `json:"reportName"` PromptID string `json:"promptId"` RunID string `json:"runId"` Status string `json:"status"` GeneratedAt time.Time `json:"generatedAt"` ValidPeriod timeutil.Period `json:"validPeriod"` OutputPath string `json:"outputPath,omitempty"` LLMDebugPath string `json:"llmDebugPath,omitempty"` PromptVersion string `json:"promptVersion"` Timezone string `json:"timezone"` ProfileID string `json:"profileId,omitempty"` BackendID string `json:"backendId,omitempty"` ModelName string `json:"modelName,omitempty"` SourceWarnings []weatherdata.SourceWarning `json:"sourceWarnings,omitempty"` ValidationStatus string `json:"validationStatus,omitempty"` Notification *generateNotificationSummary `json:"notification,omitempty"` Error string `json:"error,omitempty"` } type generateNotificationSummary struct { Status string `json:"status,omitempty"` UploadStatus string `json:"uploadStatus,omitempty"` StatusError string `json:"statusError,omitempty"` RunID string `json:"runId,omitempty"` PipelineID string `json:"pipelineId,omitempty"` BundleID string `json:"bundleId,omitempty"` IdempotencyKey string `json:"idempotencyKey,omitempty"` AcceptedAt *time.Time `json:"acceptedAt,omitempty"` StartedAt *time.Time `json:"startedAt,omitempty"` FinishedAt *time.Time `json:"finishedAt,omitempty"` Error string `json:"error,omitempty"` } type batchSummary struct { Command string `json:"command"` Batch app.BatchKind `json:"batch"` Status string `json:"status"` StartedAt time.Time `json:"startedAt"` FinishedAt time.Time `json:"finishedAt"` Total int `json:"total"` Succeeded int `json:"succeeded"` Failed int `json:"failed"` Notification *app.BatchNotificationResult `json:"notification,omitempty"` Reports []app.BatchReportResult `json:"reports"` Error string `json:"error,omitempty"` } func newGenerateSummary(result *app.ReportResult, err error) generateSummary { summary := generateSummary{Command: commandGenerate} if result == nil { return summary } summary.ReportID = result.ReportID summary.ReportName = result.ReportName summary.PromptID = result.PromptID summary.PromptVersion = result.PromptVersion summary.RunID = result.RunID summary.Status = summaryStatusSucceeded summary.GeneratedAt = result.GeneratedAt summary.ValidPeriod = result.ValidPeriod summary.Timezone = result.Timezone summary.ProfileID, summary.BackendID, summary.ModelName = result.ProfileID, result.BackendID, result.ModelName summary.SourceWarnings = append([]weatherdata.SourceWarning(nil), result.SourceWarnings...) summary.ValidationStatus = string(result.ValidationStatus) summary.OutputPath = result.OutputPath summary.LLMDebugPath = result.LLMDebugPath summary.Notification = newGenerateNotificationSummary(result.Notification) if err != nil { summary.Status = summaryStatusFailed summary.Error = err.Error() } return summary } func newGenerateNotificationSummary(result *app.NotificationResult) *generateNotificationSummary { if result == nil { return nil } summary := &generateNotificationSummary{ Status: result.Status, UploadStatus: result.UploadStatus, StatusError: result.StatusError, RunID: result.RunID, PipelineID: result.PipelineID, BundleID: result.BundleID, IdempotencyKey: result.IdempotencyKey, StartedAt: result.StartedAt, FinishedAt: result.FinishedAt, Error: result.Error, } if !result.AcceptedAt.IsZero() { acceptedAt := result.AcceptedAt summary.AcceptedAt = &acceptedAt } return summary } func newBatchSummary(result *app.BatchResult) batchSummary { summary := batchSummary{Command: commandRun} if result == nil { return summary } summary.Batch = result.Batch summary.Status = batchSummaryStatus(result) summary.StartedAt = result.StartedAt summary.FinishedAt = result.FinishedAt summary.Total = result.Total summary.Succeeded = result.Succeeded summary.Failed = result.Failed summary.Notification = result.Notification summary.Reports = append([]app.BatchReportResult(nil), result.Reports...) if summary.Status == summaryStatusFailed { summary.Error = app.BatchError{Result: result}.Error() } return summary } func batchSummaryStatus(result *app.BatchResult) string { if result == nil { return "" } if result.Failed > 0 || (result.Notification != nil && result.Notification.Status == summaryStatusFailed) { return summaryStatusFailed } return summaryStatusSucceeded } func reportName(id report.ID) string { definition, err := report.DefaultRegistry().Lookup(id) if err != nil { return string(id) } return definition.Name }