• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ghettovoice / abnf / 18693127334

21 Oct 2025 06:00PM UTC coverage: 70.854% (+1.4%) from 69.501%
18693127334

Pull #52

github

ghettovoice
Disable errtrace for generated rules and don't use it here
Pull Request #52: Optimize

412 of 497 new or added lines in 9 files covered. (82.9%)

28 existing lines in 5 files now uncovered.

1551 of 2189 relevant lines covered (70.85%)

54.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

32.81
/errors.go
1
package abnf
2

3
import (
4
        "errors"
5
        "fmt"
6
        "strings"
7
        "sync"
8
)
9

10
const (
11
        // ErrNotMatched returned by operators if input doesn't match
12
        ErrNotMatched sentinelError = "not matched"
13
)
14

15
type sentinelError string
16

17
func (e sentinelError) Error() string { return string(e) }
×
18

19
type operError struct {
20
        op  string
21
        pos uint
22
        err error
23
}
24

25
func (e operError) Unwrap() error { return e.err }
36✔
26

NEW
27
func (e operError) Error() string {
×
28
        var sb strings.Builder
×
29
        e.writeError(&sb, 0)
×
30
        return sb.String()
×
31
}
×
32

33
func (e *operError) writeError(sb *strings.Builder, depth int) {
×
34
        fmt.Fprintf(sb, "operator %q failed at position %d: ", e.op, e.pos)
×
35

×
36
        var merr multiError
×
37
        if errors.As(e.err, &merr) {
×
38
                merr.writeError(sb, depth)
×
39
        } else {
×
40
                sb.WriteString(e.err.Error())
×
41
        }
×
42
}
43

44
type multiError []error
45

46
func (e multiError) Unwrap() []error { return e }
10✔
47

48
func (e multiError) Error() string {
×
49
        var sb strings.Builder
×
50
        e.writeError(&sb, 0)
×
51
        return sb.String()
×
52
}
×
53

54
func (e multiError) writeError(sb *strings.Builder, depth int) {
×
55
        sb.WriteString("following errors are occurred:\n")
×
56

×
57
        for _, err := range e {
×
58
                var (
×
59
                        merr multiError
×
60
                        oerr *operError
×
61
                )
×
62
                if errors.As(err, &oerr) {
×
63
                        sb.WriteString(strings.Repeat("  ", depth+1) + "- ")
×
64
                        oerr.writeError(sb, depth+1)
×
65
                        sb.WriteString("\n")
×
66
                } else if errors.As(err, &merr) {
×
67
                        merr.writeError(sb, depth+1)
×
68
                } else {
×
69
                        sb.WriteString(strings.Repeat("  ", depth+1) + "- " + err.Error() + "\n")
×
70
                }
×
71
        }
72
}
73

74
const multiErrCap = 10
75

76
var multiErrPool = &sync.Pool{
77
        New: func() any {
11✔
78
                errs := multiError(make([]error, 0, multiErrCap))
11✔
79
                return &errs
11✔
80
        },
11✔
81
}
82

83
func newMultiErr(c uint) multiError {
69✔
84
        var err multiError
69✔
85
        if c <= multiErrCap {
138✔
86
                errPtr := multiErrPool.Get().(*multiError)
69✔
87
                err = *errPtr
69✔
88
        } else {
69✔
NEW
89
                err = make(multiError, 0, c)
×
NEW
90
        }
×
91
        return err
69✔
92
}
93

94
func (e *multiError) clear() {
192✔
95
        if e == nil {
192✔
NEW
96
                return
×
NEW
97
        }
×
98

99
        clear(*e)
192✔
100
        *e = (*e)[:0]
192✔
101
}
102

103
func (e *multiError) free() {
61✔
104
        if e == nil || cap(*e) > 10*multiErrCap {
61✔
NEW
105
                return
×
NEW
106
        }
×
107

108
        e.clear()
61✔
109
        multiErrPool.Put(e)
61✔
110
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc