This repository was archived by the owner on Oct 2, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy patherrorstack.go
More file actions
153 lines (133 loc) · 4.28 KB
/
errorstack.go
File metadata and controls
153 lines (133 loc) · 4.28 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Copyright 2015-2018 trivago N.V.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package tgo
import (
"fmt"
)
// ErrorStack is a helper to store errors from multiple statements for
// batch handling. Convenience functions to wrap function calls of the
// form func() (<type>, error) do exist for all golang base types.
type ErrorStack struct {
errors []error
formatter ErrorStackFormatter
}
// ErrorStackFormatter is used by ErroStack to generate a single error string
// from an array of errors.
type ErrorStackFormatter func([]error) string
// NewErrorStack creates a new error stack
func NewErrorStack() ErrorStack {
return ErrorStack{
errors: []error{},
formatter: ErrorStackFormatNumbered,
}
}
// SetFormat set the format used when Error() is called.
func (stack *ErrorStack) SetFormat(formatter ErrorStackFormatter) {
stack.formatter = formatter
}
// Push adds a new error to the top of the error stack.
// Returns if err != nil.
func (stack *ErrorStack) Push(err error) bool {
if err != nil {
stack.errors = append(stack.errors, err)
return true
}
return false
}
// Pushf adds a new error message to the top of the error stack
func (stack *ErrorStack) Pushf(message string, args ...interface{}) {
stack.errors = append(stack.errors, fmt.Errorf(message, args...))
}
// PushAndDescribe behaves like Push but allows to prepend a text before
// the error messages returned by err. The type of err will be lost.
func (stack *ErrorStack) PushAndDescribe(message string, err error) bool {
if err != nil {
stack.errors = append(stack.errors, fmt.Errorf(message+" %s", err.Error()))
return true
}
return false
}
// Pop removes an error from the top of the stack and returns it
func (stack *ErrorStack) Pop() error {
if len(stack.errors) == 0 {
return nil
}
err := stack.errors[len(stack.errors)-1]
stack.errors = stack.errors[:len(stack.errors)-1]
return err
}
// Top returns the error on top of the stack (last error pushed)
func (stack ErrorStack) Top() error {
if len(stack.errors) == 0 {
return nil
}
return stack.errors[len(stack.errors)-1]
}
// Error implements the Error interface
func (stack ErrorStack) Error() string {
if len(stack.errors) == 0 {
return ""
}
return stack.formatter(stack.errors)
}
// Errors returns all gathered errors as an array
func (stack ErrorStack) Errors() []error {
return stack.errors
}
// Len returns the number of error on the stack
func (stack ErrorStack) Len() int {
return len(stack.errors)
}
// OrNil returns this object or nil of no errors are stored
func (stack *ErrorStack) OrNil() error {
if len(stack.errors) == 0 {
return nil
}
return stack
}
// Clear removes all errors from the stack
func (stack *ErrorStack) Clear() {
stack.errors = []error{}
}
// ErrorStackFormatNumbered returns errors with a number prefix, separated by
// newline.
func ErrorStackFormatNumbered(errors []error) string {
errString := ""
lastIdx := len(errors) - 1
for i := 0; i < lastIdx; i++ {
errString = fmt.Sprintf("%s%d: %s\n", errString, i+1, errors[i].Error())
}
errString = fmt.Sprintf("%s%d: %s", errString, lastIdx+1, errors[lastIdx].Error())
return errString
}
// ErrorStackFormatNumbered returns errors separated by newline
func ErrorStackFormatNewline(errors []error) string {
errString := ""
lastIdx := len(errors) - 1
for i := 0; i < lastIdx; i++ {
errString = fmt.Sprintf("%s%s\n", errString, errors[i].Error())
}
errString = fmt.Sprintf("%s%s", errString, errors[lastIdx].Error())
return errString
}
// ErrorStackFormatNumbered returns errors separated by comma
func ErrorStackFormatCSV(errors []error) string {
errString := ""
lastIdx := len(errors) - 1
for i := 0; i < lastIdx; i++ {
errString = fmt.Sprintf("%s%s, ", errString, errors[i].Error())
}
errString = fmt.Sprintf("%s%s", errString, errors[lastIdx].Error())
return errString
}