| // Copyright 2023 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 report |
| |
| import ( |
| "fmt" |
| "sync" |
| ) |
| |
| type linter struct { |
| prefix string |
| |
| mu sync.Mutex // protects errors and groups |
| errors []string |
| groups []*linter |
| } |
| |
| // NewLinter creates a new linter. |
| // If prefix is set, all lints will have the given prefix |
| // when Errors is called. |
| func NewLinter(prefix string) *linter { |
| return &linter{ |
| prefix: prefix, |
| groups: make([]*linter, 0), |
| } |
| } |
| |
| // Group adds a new lint group to the linter and returns |
| // a pointer to it. |
| // If prefix is set, all lints in the group will have the given prefix |
| // when Errors is called. |
| func (l *linter) Group(prefix string) *linter { |
| l.mu.Lock() |
| defer l.mu.Unlock() |
| |
| g := NewLinter(prefix) |
| l.groups = append(l.groups, g) |
| return g |
| } |
| |
| // Error adds a new lint. |
| func (l *linter) Error(a ...any) { |
| l.mu.Lock() |
| defer l.mu.Unlock() |
| |
| var s = fmt.Sprint(a...) |
| l.errors = append(l.errors, s) |
| } |
| |
| // Errorf adds a new formatted lint. |
| func (l *linter) Errorf(format string, a ...any) { |
| l.Error(fmt.Sprintf(format, a...)) |
| } |
| |
| // Errors returns all the lints added to the linter |
| // and its groups so far, formatted as strings. |
| func (l *linter) Errors() []string { |
| l.mu.Lock() |
| defer l.mu.Unlock() |
| |
| result := make([]string, 0, len(l.errors)) |
| addErrs := func(errs []string) { |
| for _, err := range errs { |
| if l.prefix != "" { |
| err = fmt.Sprintf("%s: %s", l.prefix, err) |
| } |
| result = append(result, err) |
| } |
| } |
| |
| addErrs(l.errors) |
| for _, g := range l.groups { |
| addErrs(g.Errors()) |
| } |
| |
| return result |
| } |