-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser_internal.go
More file actions
69 lines (60 loc) · 1.59 KB
/
parser_internal.go
File metadata and controls
69 lines (60 loc) · 1.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package libparser
import (
liberrors "github.com/tomefile/lib-errors"
)
func (parser *Parser) makeContext(offset uint) NodeContext {
return NodeContext{
OffsetStart: offset,
OffsetEnd: parser.reader.Offset,
}
}
func (parser *Parser) process(node Node) (Node, *liberrors.DetailedError) {
// The reason it's calculated early is because it can be changed
// during post-processing, but it is still a tome.
// NOTE: This has a side-effect of tomes not being discarded by hooks.
tome_name := ""
switch node := node.(type) {
case *NodeDirective:
if node.Name == "tome" && len(node.NodeArgs) > 0 {
arg := node.NodeArgs[0]
switch arg := arg.(type) {
case *NodeLiteral:
tome_name = arg.Contents
case *NodeString:
tome_name = arg.Segments.String()
default:
tome_name = arg.String()
}
}
}
// Run hooks
offset_start := node.Context().OffsetStart
var derr *liberrors.DetailedError
for _, hook := range parser.Hooks {
node, derr = hook(node)
if derr != nil {
derr.Context = parser.reader.Context(offset_start)
parser.fillErrorTrace(derr)
return node, derr
}
if node == nil {
// Node was discarded
return nil, nil
}
}
if tome_name != "" {
parser.Result.Tomes[tome_name] = node.(*NodeDirective)
}
return node, nil
}
func (parser *Parser) write(node Node) (derr *liberrors.DetailedError) {
node, derr = parser.process(node)
if derr != nil || node == nil {
return derr
}
*parser.container = append(*parser.container, node)
return nil
}
func (parser *Parser) escaped(char, comp rune) bool {
return parser.reader.Previous() == '\\' && char == comp
}