all repos

clerk @ a69e534d08842f6663eecddd5380d88cf40d2096

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
linter: add undeclared-account, 1 month ago
1
package linter
2
3
import "olexsmir.xyz/clerk/journal/ast"
4
5
// UndeclaredAccount flags postings that reference an account not declared via `account` directive.
6
type UndeclaredAccount struct{}
7
8
func (UndeclaredAccount) ID() RuleID         { return "undeclared-account" }
9
func (UndeclaredAccount) Severity() Severity { return SeverityWarning }
10
func (r *UndeclaredAccount) CheckJournal(j *ast.Journal) []Find {
11
	declared := make(map[string]bool)
12
13
	var finds []Find
14
	for _, entry := range j.Entries {
15
		switch e := entry.(type) {
16
		case *ast.AccountDirective:
17
			declared[e.Account.String()] = true
18
		case *ast.Transaction:
19
			for _, p := range e.Postings {
20
				name := p.Account.String()
21
				if !declared[name] {
22
					finds = append(finds, Find{
23
						Code:     r.ID(),
24
						Severity: r.Severity(),
25
						Message:  "undeclared account: " + name,
26
						Span:     p.Account.Span,
27
					})
28
				}
29
			}
30
		}
31
	}
32
33
	return finds
34
}