all repos

clerk @ d12c0794480a4e65333d20e93d8a9f24a53ea056

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
linter: orderdate: build finding message without sprint, 13 days ago
1
package linter
2
3
import (
4
	"olexsmir.xyz/clerk/internal/analyzer"
5
	"olexsmir.xyz/clerk/journal/ast"
6
)
7
8
const OrderDateID RuleID = "orderdate"
9
10
// OrderDate checks that transactions are in chronological order by date.
11
type OrderDate struct{}
12
13
func (OrderDate) ID() RuleID { return OrderDateID }
14
func (o *OrderDate) CheckJournal(an *analyzer.Analysis) []Find {
15
	var finds []Find
16
	var anchor *ast.Date
17
	var anchorStr string
18
	for _, pf := range an.Files {
19
		for _, entry := range pf.Ast.Entries {
20
			txn, ok := entry.(*ast.Transaction)
21
			if !ok {
22
				continue
23
			}
24
			if anchor != nil && txn.Date.Compare(*anchor) < 0 {
25
				finds = append(finds, Find{
26
					Code:    o.ID(),
27
					Message: "transaction is out of chronological order (date " + txn.Date.String() + " before " + anchorStr + ")",
28
					Span:    txn.Date.Span,
29
				})
30
				continue
31
			}
32
			anchor = &txn.Date
33
			anchorStr = anchor.String()
34
		}
35
	}
36
	return finds
37
}