go-common/app/admin/main/config/pkg/lint/lint.go

64 lines
1.2 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package lint
import (
"errors"
"fmt"
"io"
"strings"
)
var linterMap map[string]Linter
// ErrLintNotExists .
var ErrLintNotExists = errors.New("linter not exists")
func init() {
linterMap = make(map[string]Linter)
}
// RegisterLinter register linter for a kind of file
func RegisterLinter(filetype string, linter Linter) {
if _, ok := linterMap[filetype]; ok {
panic("linter for filetype " + filetype + " already exists")
}
linterMap[filetype] = linter
}
// LineErr error contains line number
type LineErr struct {
Line int `json:"line"`
Message string `json:"message"`
}
// Error lint error
type Error []LineErr
func (errs Error) Error() string {
messages := make([]string, 0, len(errs))
for _, err := range errs {
messages = append(messages, fmt.Sprintf("%d:%s", err.Line, err.Message))
}
return strings.Join(messages, "\n")
}
func (errs Error) String() string {
return errs.Error()
}
// Linter lint config file
type Linter interface {
Lint(r io.Reader) Error
}
// Lint config file,
func Lint(filetype string, r io.Reader) error {
lint, ok := linterMap[filetype]
if !ok {
return ErrLintNotExists
}
if lintErr := lint.Lint(r); lintErr != nil {
return lintErr
}
return nil
}