5 files changed,
42 insertions(+),
0 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-06-27 12:41:04 +0300
Authored at:
2026-06-26 15:55:07 +0300
Change ID:
oxukxnmkqvtytttzryvvlnrsqstluzun
Parent:
731ba24
A
internal/linter/rule_duplicated_account.go
··· 1 +package linter 2 + 3 +import "olexsmir.xyz/clerk/journal/ast" 4 + 5 +// DuplicatedAccount flags account declarations that appear more than once. 6 +type DuplicatedAccount struct{} 7 + 8 +func (DuplicatedAccount) ID() RuleID { return "duplicated-account" } 9 +func (DuplicatedAccount) Severity() Severity { return SeverityWarning } 10 +func (d *DuplicatedAccount) CheckJournal(j *ast.Journal) []Find { 11 + var finds []Find 12 + seen := make(map[string]bool) 13 + 14 + for _, entry := range j.Entries { 15 + ad, ok := entry.(*ast.AccountDirective) 16 + if !ok { 17 + continue 18 + } 19 + 20 + name := ad.Account.String() 21 + if seen[name] { 22 + finds = append(finds, Find{ 23 + Code: d.ID(), 24 + Severity: d.Severity(), 25 + Message: "duplicated account declaration: " + name, 26 + Span: ad.Account.Span, 27 + }) 28 + } 29 + seen[name] = true 30 + } 31 + return finds 32 +}
A
internal/linter/testdata/duplicated-account.golden
··· 1 +duplicated-account.journal:4:9: duplicated-account: duplicated account declaration: Expenses:Food 2 +duplicated-account.journal:6:9: duplicated-account: duplicated account declaration: Expenses:Transport