MCPcopy Index your code
hub / github.com/cockroachdb/errors / decodeLeaf

Function decodeLeaf

errbase/decode.go:35–98  ·  view source on GitHub ↗
(ctx context.Context, enc *errorspb.EncodedErrorLeaf)

Source from the content-addressed store, hash-verified

33}
34
35func decodeLeaf(ctx context.Context, enc *errorspb.EncodedErrorLeaf) error {
36 // In case there is a detailed payload, decode it.
37 var payload proto.Message
38 if enc.Details.FullDetails != nil {
39 var d types.DynamicAny
40 err := types.UnmarshalAny(enc.Details.FullDetails, &d)
41 if err != nil {
42 // It's OK if we can't decode. We'll use
43 // the opaque type below.
44 warningFn(ctx, "error while unmarshalling error: %+v", err)
45 } else {
46 payload = d.Message
47 }
48 }
49
50 // Do we have a leaf decoder for this type?
51 typeKey := TypeKey(enc.Details.ErrorTypeMark.FamilyName)
52 if decoder, ok := leafDecoders[typeKey]; ok {
53 // Yes, use it.
54 genErr := decoder(ctx, enc.Message, enc.Details.ReportablePayload, payload)
55 if genErr != nil {
56 // Decoding succeeded. Use this.
57 return genErr
58 }
59 // Decoding failed, we'll drop through to opaqueLeaf{} below.
60 } else if decoder, ok := multiCauseDecoders[typeKey]; ok {
61 causes := make([]error, len(enc.MultierrorCauses))
62 for i, e := range enc.MultierrorCauses {
63 causes[i] = DecodeError(ctx, *e)
64 }
65 genErr := decoder(ctx, causes, enc.Message, enc.Details.ReportablePayload, payload)
66 if genErr != nil {
67 return genErr
68 }
69 } else {
70 // Shortcut for non-registered proto-encodable error types:
71 // if it already implements `error`, it's good to go.
72 if e, ok := payload.(error); ok {
73 // yes: we're done!
74 return e
75 }
76 }
77
78 if len(enc.MultierrorCauses) > 0 {
79 causes := make([]error, len(enc.MultierrorCauses))
80 for i, e := range enc.MultierrorCauses {
81 causes[i] = DecodeError(ctx, *e)
82 }
83 leaf := &opaqueLeafCauses{
84 causes: causes,
85 }
86 leaf.msg = enc.Message
87 leaf.details = enc.Details
88 return leaf
89 }
90
91 // No decoder and no error type: we'll keep what we received and
92 // make it ready to re-encode exactly (if the error leaves over the

Callers 1

DecodeErrorFunction · 0.70

Calls 2

TypeKeyTypeAlias · 0.85
DecodeErrorFunction · 0.70

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…