1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 *   http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20package thrift
21
22import (
23	"encoding/base64"
24	"errors"
25)
26
27// Thrift Protocol exception
28type TProtocolException interface {
29	TException
30	TypeId() int
31}
32
33const (
34	UNKNOWN_PROTOCOL_EXCEPTION = 0
35	INVALID_DATA               = 1
36	NEGATIVE_SIZE              = 2
37	SIZE_LIMIT                 = 3
38	BAD_VERSION                = 4
39	NOT_IMPLEMENTED            = 5
40	DEPTH_LIMIT                = 6
41)
42
43type tProtocolException struct {
44	typeId int
45	err    error
46	msg    string
47}
48
49var _ TProtocolException = (*tProtocolException)(nil)
50
51func (tProtocolException) TExceptionType() TExceptionType {
52	return TExceptionTypeProtocol
53}
54
55func (p *tProtocolException) TypeId() int {
56	return p.typeId
57}
58
59func (p *tProtocolException) String() string {
60	return p.msg
61}
62
63func (p *tProtocolException) Error() string {
64	return p.msg
65}
66
67func (p *tProtocolException) Unwrap() error {
68	return p.err
69}
70
71func NewTProtocolException(err error) TProtocolException {
72	if err == nil {
73		return nil
74	}
75
76	if e, ok := err.(TProtocolException); ok {
77		return e
78	}
79
80	if errors.As(err, new(base64.CorruptInputError)) {
81		return NewTProtocolExceptionWithType(INVALID_DATA, err)
82	}
83
84	return NewTProtocolExceptionWithType(UNKNOWN_PROTOCOL_EXCEPTION, err)
85}
86
87func NewTProtocolExceptionWithType(errType int, err error) TProtocolException {
88	if err == nil {
89		return nil
90	}
91	return &tProtocolException{
92		typeId: errType,
93		err:    err,
94		msg:    err.Error(),
95	}
96}
97
98func prependTProtocolException(prepend string, err TProtocolException) TProtocolException {
99	return &tProtocolException{
100		typeId: err.TypeId(),
101		err:    err,
102		msg:    prepend + err.Error(),
103	}
104}
105