package cli import ( "encoding/json" "fmt" "io" "gitea.maximumdirect.net/eric/weatherreporter/internal/app" ) type outputOptions struct { Quiet bool } func writeActionResult(stdout, stderr io.Writer, value any, opts outputOptions, writeStatus func(io.Writer)) error { if opts.Quiet { return nil } if writeStatus != nil && stderr != nil { writeStatus(stderr) } return writeJSON(stdout, value) } func writeJSON(stdout io.Writer, value any) error { encoder := json.NewEncoder(stdout) encoder.SetIndent("", " ") return encoder.Encode(value) } func writeBatchStatus(stderr io.Writer, result *app.BatchResult) { if stderr == nil || result == nil { return } for _, item := range result.Reports { if item.Status == "failed" { _, _ = fmt.Fprintf(stderr, "report=%s status=failed error=%q\n", item.ReportID, item.Error) continue } if item.Status == "canceled" { _, _ = fmt.Fprintf(stderr, "report=%s status=canceled\n", item.ReportID) continue } _, _ = fmt.Fprintf(stderr, "report=%s status=succeeded output=%q\n", item.ReportID, item.OutputPath) } if result.Notification != nil { _, _ = fmt.Fprintf(stderr, "batchNotification status=%q", result.Notification.Status) if result.Notification.Reason != "" { _, _ = fmt.Fprintf(stderr, " reason=%q", result.Notification.Reason) } if result.Notification.RunID != "" { _, _ = fmt.Fprintf(stderr, " runId=%q", result.Notification.RunID) } if result.Notification.PipelineID != "" { _, _ = fmt.Fprintf(stderr, " pipelineId=%q", result.Notification.PipelineID) } if result.Notification.BundleID != "" { _, _ = fmt.Fprintf(stderr, " bundleId=%q", result.Notification.BundleID) } if result.Notification.Error != "" { _, _ = fmt.Fprintf(stderr, " error=%q", result.Notification.Error) } _, _ = fmt.Fprintln(stderr) } _, _ = fmt.Fprintf(stderr, "batch=%s total=%d succeeded=%d failed=%d canceled=%d\n", result.Batch, result.Total, result.Succeeded, result.Failed, result.Canceled) }