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

ghettovoice / abnf / 18691869999

21 Oct 2025 05:08PM UTC coverage: 70.749% (+1.2%) from 69.501%
18691869999

Pull #52

github

ghettovoice
Optimize node cache key building, re-use hasher from pool
Pull Request #52: Optimize

375 of 439 new or added lines in 8 files covered. (85.42%)

27 existing lines in 4 files now uncovered.

1531 of 2164 relevant lines covered (70.75%)

54.91 hits per line

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

5.13
/errors.go
1
package abnf
2

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

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

14
type sentinelError string
15

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

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

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

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

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

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

43
type multiError []error
44

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

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

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

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

73
// const multiErrCap = 10
74

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

82
// func newMultiErr(c int) multiError {
83
//         var err multiError
84
//         if c <= multiErrCap {
85
//                 err = *(multiErrPool.Get().(*multiError))
86
//         } else {
87
//                 err = make(multiError, 0, c)
88
//         }
89
//         return err
90
// }
91

92
// func freeMultiErr(err multiError) {
93
//         if err == nil || cap(err) > 10*multiErrCap {
94
//                 return
95
//         }
96

97
//         clear(err)
98
//         multiErrPool.Put(&err)
99
// }
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