diff options
Diffstat (limited to 'internal/cvss/v30vector.go')
-rw-r--r-- | internal/cvss/v30vector.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/internal/cvss/v30vector.go b/internal/cvss/v30vector.go new file mode 100644 index 0000000..4154a2f --- /dev/null +++ b/internal/cvss/v30vector.go @@ -0,0 +1,65 @@ +// CVSS vector parser. +package cvss + +import ( + "strings" +) + +// CVSS v3.0 prefix +var v30Prefix = "CVSS:3.0/" + +// CVSS 3.0 vector. +type v30Vector []v3Metric + +// Convert vector to string +func (v v30Vector) String() string { + // convert to slice of metrics + metrics := []v3Metric(v) + + // build vector + r := make([]string, len(metrics)) + for i, m := range(metrics) { + r[i] = m.String() + } + + // build and return string + return v30Prefix + strings.Join(r, "/") +} + +// Return CVSS version. +func (v30Vector) Version() Version { + return V30 +} + +// Return metrics in this vector. +func (v v30Vector) Metrics() []Metric { + // build result + r := make([]Metric, len(v)) + for i, m := range(v) { + r[i] = m + } + + // return result + return r +} + +// create CVSS 3.0 vector from string +func newV30Vector(s string) (Vector, error) { + strs := strings.Split(s, "/") + r := make([]v3Metric, len(strs)) + + // walk metric strings + for i, ms := range(strs) { + // convert metric string to metric + m, err := getV3Metric(V30, ms) + if err != nil { + return nil, err + } + + // add to results + r[i] = m + } + + // build and return vector + return v30Vector(r), nil +} |