package issue import ( "fmt" "strings" "time" ) type discussionIssue struct { Number int64 Title string Author string State string Labels []string Body string CreatedAt time.Time } type discussionComment struct { Author string CreatedAt time.Time Body string } // formatDiscussionMarkdown renders an issue and its comments as a single // Markdown document suitable for display without further parsing. func formatDiscussionMarkdown(issue discussionIssue, comments []discussionComment) string { var b strings.Builder fmt.Fprintf(&b, "# %s (#%d)\n\n", issue.Title, issue.Number) fmt.Fprintf(&b, "**Author:** %s\n", issue.Author) fmt.Fprintf(&b, "**State:** %s\n", issue.State) if len(issue.Labels) > 0 { fmt.Fprintf(&b, "**Labels:** %s\n", strings.Join(issue.Labels, ", ")) } if !issue.CreatedAt.IsZero() { fmt.Fprintf(&b, "**Created:** %s\n", issue.CreatedAt.UTC().Format(time.RFC3339)) } b.WriteString("\n") b.WriteString(strings.TrimSpace(issue.Body)) b.WriteString("\n\n---\n\n## Comments\n\n") if len(comments) == 0 { b.WriteString("_No comments yet._\n") return b.String() } for i, c := range comments { fmt.Fprintf(&b, "### %s", c.Author) if !c.CreatedAt.IsZero() { fmt.Fprintf(&b, " on %s", c.CreatedAt.UTC().Format(time.RFC3339)) } b.WriteString("\n\n") b.WriteString(strings.TrimSpace(c.Body)) if i < len(comments)-1 { b.WriteString("\n\n---\n\n") } else { b.WriteString("\n") } } return b.String() }