all repos

clerk @ 368f35af2811d8688f0ff80ac6f71b873203be00

missing tooling for ledger/hledger

clerk/journal/ast/ast.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: semantic highlights, 2 months ago
1
package ast
2
3
import (
4
	"strings"
5
6
	"olexsmir.xyz/clerk/journal/token"
7
)
8
9
type Journal struct {
10
	Entries []Entry
11
	Errors  []*ParseError
12
}
13
14
type Entry interface {
15
	entryNode()
16
}
17
18
type ParseError struct {
19
	Span    token.Span
20
	Message string
21
}
22
23
type FileError struct {
24
	Path    string
25
	Span    token.Span
26
	Message string
27
}
28
29
type Date struct {
30
	Year, Month, Day int
31
	Sep              byte // '-' '/' '.'
32
	Span             token.Span
33
}
34
35
type Time struct {
36
	Hour, Minute, Second int
37
	Span                 token.Span
38
}
39
40
type DateTime struct {
41
	Date Date
42
	Time *Time
43
	Span token.Span
44
}
45
46
type Comment struct {
47
	Marker byte // ';' '#' '%' '*'
48
	Text   string
49
	Span   token.Span
50
}
51
52
func (Comment) entryNode() {}
53
54
type StatusType int
55
56
func (s StatusType) String() string {
57
	switch s {
58
	case StatusCleared:
59
		return "*"
60
	case StatusPending:
61
		return "!"
62
	case StatusNone:
63
		return ""
64
	default:
65
		panic("unreachable")
66
	}
67
}
68
69
const (
70
	StatusCleared StatusType = iota // * cleared
71
	StatusPending                   // ! pending
72
	StatusNone                      // not set
73
)
74
75
type Status struct {
76
	Value StatusType
77
	Span  token.Span
78
}
79
80
type Code struct {
81
	Value string
82
	Span  token.Span
83
}
84
85
type Note struct {
86
	Value string
87
	Span  token.Span
88
}
89
90
type Description struct {
91
	Value string
92
	Span  token.Span
93
}
94
95
type Expr struct {
96
	Value string
97
	Span  token.Span
98
}
99
100
type Payee struct {
101
	Name string
102
	Span token.Span
103
}
104
105
type SubAccount struct {
106
	Name string
107
	Span token.Span
108
}
109
110
type Account struct {
111
	Name []SubAccount // ['expenses' 'food']
112
	Span token.Span
113
}
114
115
func (a Account) String() string {
116
	if len(a.Name) == 0 {
117
		return ""
118
	}
119
	var name strings.Builder
120
	name.Grow(len(a.Name))
121
	name.WriteString(a.Name[0].Name)
122
	for _, s := range a.Name[1:] {
123
		name.WriteByte(':')
124
		name.WriteString(s.Name)
125
	}
126
	return name.String()
127
}