4
0

csv.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package report
  2. import (
  3. "encoding/csv"
  4. "io"
  5. "strconv"
  6. "strings"
  7. )
  8. type CsvReporter struct {
  9. }
  10. var _ Reporter = (*CsvReporter)(nil)
  11. func (r *CsvReporter) Write(w io.WriteCloser, findings []Finding) error {
  12. if len(findings) == 0 {
  13. return nil
  14. }
  15. var (
  16. cw = csv.NewWriter(w)
  17. err error
  18. )
  19. columns := []string{"RuleID",
  20. "Commit",
  21. "File",
  22. "SymlinkFile",
  23. "Secret",
  24. "Match",
  25. "StartLine",
  26. "EndLine",
  27. "StartColumn",
  28. "EndColumn",
  29. "Author",
  30. "Message",
  31. "Date",
  32. "Email",
  33. "Fingerprint",
  34. "Tags",
  35. }
  36. // A miserable attempt at "omitempty" so tests don't yell at me.
  37. if findings[0].Link != "" {
  38. columns = append(columns, "Link")
  39. }
  40. if err = cw.Write(columns); err != nil {
  41. return err
  42. }
  43. for _, f := range findings {
  44. row := []string{f.RuleID,
  45. f.Commit,
  46. f.File,
  47. f.SymlinkFile,
  48. f.Secret,
  49. f.Match,
  50. strconv.Itoa(f.StartLine),
  51. strconv.Itoa(f.EndLine),
  52. strconv.Itoa(f.StartColumn),
  53. strconv.Itoa(f.EndColumn),
  54. f.Author,
  55. f.Message,
  56. f.Date,
  57. f.Email,
  58. f.Fingerprint,
  59. strings.Join(f.Tags, " "),
  60. }
  61. if findings[0].Link != "" {
  62. row = append(row, f.Link)
  63. }
  64. if err = cw.Write(row); err != nil {
  65. return err
  66. }
  67. }
  68. cw.Flush()
  69. return cw.Error()
  70. }