(ctx context.Context, enc *errorspb.EncodedErrorLeaf)
| 33 | } |
| 34 | |
| 35 | func 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 |
no test coverage detected
searching dependent graphs…