all repos

clerk @ f3b258b6c2faf2042ec439726a44238041014d24

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
improve analyzer, 1 day 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
30
	for _, rule := range l.rules {
31
		if jc, ok := rule.(Rule); ok {
32
			finds = append(finds, jc.CheckJournal(a)...)
33
		}
34
	}
35
36
	return finds
37
}
38
39
// Severity represents severity of the litning find.
40
type Severity int
41
42
const (
43
	SeverityError   Severity = 1
44
	SeverityWarning Severity = 2
45
	SeverityInfo    Severity = 3
46
	SeverityHint    Severity = 4
47
)
48
49
func (s Severity) String() string {
50
	switch s {
51
	case SeverityError:
52
		return "error"
53
	case SeverityWarning:
54
		return "warning"
55
	case SeverityInfo:
56
		return "info"
57
	case SeverityHint:
58
		return "hint"
59
	}
60
	panic("impossible severity state")
61
}