internal/osv: add review status
Ecosystem metrics cannot pick up REVIEWED vs UNREVIWED unless
govulncheck produces it.
Change-Id: Ia6ea1ef7cf681ac51e18dd32748dc658a72ebad9
Reviewed-on: https://go-review.googlesource.com/c/vuln/+/591055
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Run-TryBot: Zvonimir Pavlinovic <zpavlinovic@google.com>
diff --git a/internal/osv/osv.go b/internal/osv/osv.go
index 5b7e892..0bb44b2 100644
--- a/internal/osv/osv.go
+++ b/internal/osv/osv.go
@@ -235,4 +235,6 @@
// The URL of the Go advisory for this vulnerability, of the form
// "https://pkg.go.dev/GO-YYYY-XXXX".
URL string `json:"url,omitempty"`
+ // The review status of this report (UNREVIEWED or REVIEWED).
+ ReviewStatus ReviewStatus `json:"review_status,omitempty"`
}
diff --git a/internal/osv/review_status.go b/internal/osv/review_status.go
new file mode 100644
index 0000000..7185e18
--- /dev/null
+++ b/internal/osv/review_status.go
@@ -0,0 +1,67 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package osv
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+type ReviewStatus int
+
+const (
+ ReviewStatusUnknown ReviewStatus = iota
+ ReviewStatusUnreviewed
+ ReviewStatusReviewed
+)
+
+var statusStrs = []string{
+ ReviewStatusUnknown: "",
+ ReviewStatusUnreviewed: "UNREVIEWED",
+ ReviewStatusReviewed: "REVIEWED",
+}
+
+func (r ReviewStatus) String() string {
+ if !r.IsValid() {
+ return fmt.Sprintf("INVALID(%d)", r)
+ }
+ return statusStrs[r]
+}
+
+func ReviewStatusValues() []string {
+ return statusStrs[1:]
+}
+
+func (r ReviewStatus) IsValid() bool {
+ return int(r) >= 0 && int(r) < len(statusStrs)
+}
+
+func ToReviewStatus(s string) (ReviewStatus, bool) {
+ for stat, str := range statusStrs {
+ if s == str {
+ return ReviewStatus(stat), true
+ }
+ }
+ return 0, false
+}
+
+func (r ReviewStatus) MarshalJSON() ([]byte, error) {
+ if !r.IsValid() {
+ return nil, fmt.Errorf("MarshalJSON: unrecognized review status: %d", r)
+ }
+ return json.Marshal(r.String())
+}
+
+func (r *ReviewStatus) UnmarshalJSON(b []byte) error {
+ var s string
+ if err := json.Unmarshal(b, &s); err != nil {
+ return err
+ }
+ if rs, ok := ToReviewStatus(s); ok {
+ *r = rs
+ return nil
+ }
+ return fmt.Errorf("UnmarshalJSON: unrecognized review status: %s", s)
+}