all repos

clerk @ d216565790d8ef1d462624ae33bf932fa28c2021

missing tooling for ledger/hledger

clerk/internal/linter/linter.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
staticcheck; errcheck, 2 months ago
1
package linter
2
3
import (
4
	"olexsmir.xyz/clerk/internal/analyzer"
5
	"olexsmir.xyz/clerk/journal/token"
6
)
7
8
// A Find represents a single lint finding.
9
type Find struct {
10
	Code     RuleID
11
	Severity Severity
12
	Message  string
13
	Span     token.Span
14
}
15
16
// Linter runs lint rules against a parsed journal.
17
type Linter struct {
18
	rules []Rule
19
}
20
21
// NewLinter creates a [Linter] with the given rules.
22
func NewLinter(rules []Rule) *Linter {
23
	return &Linter{rules: rules}
24
}
25
26
// Run runs all rules against the analysis context.
27
func (l *Linter) Run(a *analyzer.Analysis) []Find {
28
	var finds []Find
29
	for _, rule := range l.rules {
30
		finds = append(finds, rule.CheckJournal(a)...)
31
	}
32
	return finds
33
}
34
35
// Severity represents severity of the litning find.
36
type Severity int
37
38
const (
39
	SeverityError   Severity = 1
40
	SeverityWarning Severity = 2
41
	SeverityInfo    Severity = 3
42
	SeverityHint    Severity = 4
43
)
44
45
func (s Severity) String() string {
46
	switch s {
47
	case SeverityError:
48
		return "error"
49
	case SeverityWarning:
50
		return "warning"
51
	case SeverityInfo:
52
		return "info"
53
	case SeverityHint:
54
		return "hint"
55
	}
56
	panic("impossible severity state")
57
}