mirror of
https://github.com/edgelesssys/constellation.git
synced 2024-12-14 18:34:31 -05:00
89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
|
/*
|
||
|
Copyright (c) Edgeless Systems GmbH
|
||
|
|
||
|
SPDX-License-Identifier: AGPL-3.0-only
|
||
|
*/
|
||
|
|
||
|
// package issues can store and report issues found during the bazel-deps-mirror process.
|
||
|
package issues
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
// Map is a map of issues arranged by path => rulename => issues.
|
||
|
type Map map[string]map[string][]error
|
||
|
|
||
|
// New creates a new Map.
|
||
|
func New() Map {
|
||
|
return make(map[string]map[string][]error)
|
||
|
}
|
||
|
|
||
|
// Set sets all issues for a file.
|
||
|
func (m Map) Set(file string, issues ByFile) {
|
||
|
m[file] = issues
|
||
|
}
|
||
|
|
||
|
// Report prints all issues to a writer in a human-readable format.
|
||
|
func (m Map) Report(w io.Writer) {
|
||
|
files := make([]string, 0, len(m))
|
||
|
for f := range m {
|
||
|
files = append(files, f)
|
||
|
}
|
||
|
sort.Strings(files)
|
||
|
|
||
|
for _, file := range files {
|
||
|
rules := make([]string, 0, len(m[file]))
|
||
|
for r := range m[file] {
|
||
|
rules = append(rules, r)
|
||
|
}
|
||
|
sort.Strings(rules)
|
||
|
|
||
|
fmt.Fprintf(w, "File %s (%d issues total):\n", file, m.IssuesPerFile(file))
|
||
|
for _, rule := range rules {
|
||
|
ruleIssues := m[file][rule]
|
||
|
if len(ruleIssues) == 0 {
|
||
|
continue
|
||
|
}
|
||
|
fmt.Fprintf(w, " Rule %s (%d issues total):\n", rule, m.IssuesPerRule(file, rule))
|
||
|
for _, issue := range ruleIssues {
|
||
|
fmt.Fprintf(w, " %s\n", issue)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// FileHasIssues returns true if the file has any issues.
|
||
|
func (m Map) FileHasIssues(file string) bool {
|
||
|
return m[file] != nil
|
||
|
}
|
||
|
|
||
|
// IssuesPerFile returns the number of issues for a file.
|
||
|
func (m Map) IssuesPerFile(file string) int {
|
||
|
sum := 0
|
||
|
for _, ruleIssues := range m[file] {
|
||
|
sum += len(ruleIssues)
|
||
|
}
|
||
|
return sum
|
||
|
}
|
||
|
|
||
|
// IssuesPerRule returns the number of issues for a rule.
|
||
|
func (m Map) IssuesPerRule(file string, rule string) int {
|
||
|
return len(m[file][rule])
|
||
|
}
|
||
|
|
||
|
// ByFile is a map of issues belonging to one file arranged by rulename => issues.
|
||
|
type ByFile map[string][]error
|
||
|
|
||
|
// NewByFile creates a new ByFile.
|
||
|
func NewByFile() ByFile {
|
||
|
return make(map[string][]error)
|
||
|
}
|
||
|
|
||
|
// Add adds one or more issues belonging to a rule.
|
||
|
func (m ByFile) Add(rule string, issues ...error) {
|
||
|
m[rule] = append(m[rule], issues...)
|
||
|
}
|