1
+ {{$varlen := len .Vars}}
2
+
3
+ type {{ .ErrName }} struct {
4
+ err error
5
+ op string
6
+ traits map[grr.Trait]string
7
+
8
+ {{- range .Vars }}
9
+ {{ .Literal }} {{ .Type }}
10
+ {{- end }}
11
+ }
12
+
13
+ var _ grr.Error = &{{ .ErrName }}{}
14
+
15
+ func (e *{{ .ErrName }}) Error() string {
16
+ return fmt.Sprintf("{{ .Message }}", {{ range $i, $pair := .Vars }}e.{{ $pair.Literal }}{{ if notlast $i $varlen}}, {{ end }}{{ end }})
17
+ }
18
+
19
+ func (e *{{ .ErrName }}) Unwrap() error {
20
+ return e.err
21
+ }
22
+
23
+ func (e *{{ .ErrName }}) AsGrr(err grr.Error) (Error, bool) {
24
+ E := reflect.TypeOf(err)
25
+
26
+ var last error = e.err
27
+
28
+ for {
29
+ if last == nil {
30
+ return nil, false
31
+ }
32
+
33
+ if _, ok := last.(Error); !ok {
34
+ return nil, false
35
+ }
36
+
37
+ if reflect.TypeOf(last).ConvertibleTo(E) {
38
+ return reflect.ValueOf(last).Convert(E).Interface().(Error), true
39
+ }
40
+
41
+ last = last.(Error).Unwrap()
42
+ }
43
+ }
44
+
45
+
46
+ func (e *{{ .ErrName }}) IsGrr(err grr.Error) bool {
47
+ _, ok := e.AsGrr(err)
48
+ return ok
49
+ }
50
+
51
+ func (e *{{ .ErrName }}) AddTrait(trait string, value string) grr.Error {
52
+ e.traits[trait] = value
53
+ return e
54
+ }
55
+
56
+ func (e *{{ .ErrName }}) GetTrait(key grr.Trait) (string, bool) {
57
+ trait, ok := e.traits[key]
58
+ return trait, ok
59
+ }
60
+
61
+ func (e *{{ .ErrName }}) GetTraits() map[grr.Trait]string {
62
+ traits := make(map[grr.Trait]string)
63
+ for k, v := range e.traits {
64
+ traits[k] = v
65
+ }
66
+ return traits
67
+ }
68
+
69
+
70
+ func (e *{{ .ErrName }}) AddOp(op string) grr.Error {
71
+ e.op = op
72
+ return e
73
+ }
74
+
75
+ func (e *{{ .ErrName }}) GetOp() (string, bool) {
76
+ return e.op, e.op != ""
77
+ }
78
+
79
+ func (e *{{ .ErrName }}) AddError(err error) grr.Error {
80
+ e.err = err
81
+ return e
82
+ }
83
+
84
+ func New{{ .ErrName }}({{ range $i, $pair := .Vars }}{{ $pair.Literal }} {{ $pair.Type }}{{ if notlast $i $varlen}}, {{ end }}{{ end }}) grr.Error {
85
+ return &{{ .ErrName }}{
86
+ {{- range .Vars }}
87
+ {{ .Literal }}: {{ .Literal }},
88
+ {{- end }}
89
+ }
90
+ }
0 commit comments