...
1 package filtering
2
3 import (
4 "errors"
5 "fmt"
6 "strings"
7 )
8
9 type filterError interface {
10 Position() Position
11 Message() string
12 Filter() string
13 }
14
15 func appendFilterError(s *strings.Builder, err error) {
16 var errFilter filterError
17 if !errors.As(err, &errFilter) {
18 return
19 }
20 _ = s.WriteByte('\n')
21 _, _ = s.WriteString(errFilter.Filter())
22 _ = s.WriteByte('\n')
23 for i := int32(1); i < errFilter.Position().Column; i++ {
24 _ = s.WriteByte(' ')
25 }
26 _, _ = s.WriteString("^ ")
27 _, _ = s.WriteString(errFilter.Message())
28 _, _ = s.WriteString(" (")
29 _, _ = s.WriteString(errFilter.Position().String())
30 _, _ = s.WriteString(")\n")
31 appendFilterError(s, errors.Unwrap(err))
32 }
33
34 type lexError struct {
35 filter string
36 position Position
37 message string
38 }
39
40 var _ filterError = &lexError{}
41
42 func (l *lexError) Filter() string {
43 return l.filter
44 }
45
46 func (l *lexError) Position() Position {
47 return l.position
48 }
49
50 func (l *lexError) Message() string {
51 return l.message
52 }
53
54 func (l *lexError) Error() string {
55 return fmt.Sprintf("%s: %s", l.position, l.message)
56 }
57
58 type parseError struct {
59 filter string
60 position Position
61 message string
62 err error
63 }
64
65 func (p *parseError) Filter() string {
66 return p.filter
67 }
68
69 func (p *parseError) Position() Position {
70 return p.position
71 }
72
73 func (p *parseError) Message() string {
74 return p.message
75 }
76
77 func (p *parseError) Unwrap() error {
78 return p.err
79 }
80
81 func (p *parseError) Error() string {
82 if p == nil {
83 return "<nil>"
84 }
85 var b strings.Builder
86 appendFilterError(&b, p)
87 return b.String()
88 }
89
90 type typeError struct {
91 message string
92 err error
93 }
94
95 func (t *typeError) Error() string {
96 if t.err != nil {
97 return fmt.Sprintf("%s: %v", t.message, t.err)
98 }
99 return t.message
100 }
101
View as plain text