blob: e6d5e50d1567e6eaae3d17f91911d29a46c3c809 [file] [log] [blame]
// 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
}