all repos

clerk @ 8e87a98

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
parser: separate account names by :, 1 month 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 Payee struct {
81
	Name string
82
	Span token.Span
83
}
84
85
type SubAccount struct {
86
	Name string
87
	Span token.Span
88
}
89
90
type Account struct {
91
	Name []SubAccount // ['expenses' 'food']
92
	Span token.Span
93
}
94
95
func (a Account) String() string {
96
	if len(a.Name) == 0 {
97
		return ""
98
	}
99
	var name strings.Builder
100
	name.Grow(len(a.Name))
101
	name.WriteString(a.Name[0].Name)
102
	for _, s := range a.Name[1:] {
103
		name.WriteByte(':')
104
		name.WriteString(s.Name)
105
	}
106
	return name.String()
107
}