-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpect.go
More file actions
58 lines (52 loc) · 1.46 KB
/
Copy pathexpect.go
File metadata and controls
58 lines (52 loc) · 1.46 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
package parser
import (
"github.com/ProCode-Software/klar/internal/klarerrs"
"github.com/ProCode-Software/klar/internal/lexer"
"github.com/ProCode-Software/klar/internal/ranges"
)
type expectFlag interface{ expect() }
var noAdvance _flagNoAdvance
type (
_flagNoAdvance struct{} // Don't advance when there is an error
expectErrorCode klarerrs.Code
expectError struct{ err *klarerrs.Error } // [Parser.Expect] can modify this error
withLabel string
withMessage string
)
func (_flagNoAdvance) expect() {}
func (expectErrorCode) expect() {}
func (expectError) expect() {}
func (withLabel) expect() {}
func (withMessage) expect() {}
func withExpectFlags(
flags []expectFlag, exp lexer.TokenType, got lexer.Token,
) (err *Error, stay bool) {
for _, flag := range flags {
switch flag := flag.(type) {
case expectError:
err = flag.err
err.Info = klarerrs.TokenInfo(got)
err.Range = ranges.FromToken(got)
if err.Code == 0 {
err.Code = klarerrs.ErrExpectedToken
}
case withLabel:
if err == nil {
err = klarerrs.Token(klarerrs.ErrExpectedToken, got)
}
err.Label = string(flag)
case withMessage:
err = klarerrs.ExpectedTokenf(string(flag), exp, got)
err.SetParam("msg", string(flag))
case expectErrorCode:
err = klarerrs.Token(klarerrs.Code(flag), got)
case _flagNoAdvance:
stay = true
}
}
if err == nil {
err = klarerrs.Token(klarerrs.ErrExpectedToken, got)
}
err.SetParam("expected", exp)
return
}