blob: 32d5b0147a2f001e6855472447fbc32c175d6f35 [file] [log] [blame]
Matteo Scandoloa4285862020-12-01 18:10:10 -08001/*
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
David K. Bainbridge06631892021-08-19 13:07:00 +000022import (
23 "context"
24)
25
Matteo Scandoloa4285862020-12-01 18:10:10 -080026const (
27 UNKNOWN_APPLICATION_EXCEPTION = 0
28 UNKNOWN_METHOD = 1
29 INVALID_MESSAGE_TYPE_EXCEPTION = 2
30 WRONG_METHOD_NAME = 3
31 BAD_SEQUENCE_ID = 4
32 MISSING_RESULT = 5
33 INTERNAL_ERROR = 6
34 PROTOCOL_ERROR = 7
David K. Bainbridge06631892021-08-19 13:07:00 +000035 INVALID_TRANSFORM = 8
36 INVALID_PROTOCOL = 9
37 UNSUPPORTED_CLIENT_TYPE = 10
Matteo Scandoloa4285862020-12-01 18:10:10 -080038)
39
David K. Bainbridge06631892021-08-19 13:07:00 +000040var defaultApplicationExceptionMessage = map[int32]string{
41 UNKNOWN_APPLICATION_EXCEPTION: "unknown application exception",
42 UNKNOWN_METHOD: "unknown method",
43 INVALID_MESSAGE_TYPE_EXCEPTION: "invalid message type",
44 WRONG_METHOD_NAME: "wrong method name",
45 BAD_SEQUENCE_ID: "bad sequence ID",
46 MISSING_RESULT: "missing result",
47 INTERNAL_ERROR: "unknown internal error",
48 PROTOCOL_ERROR: "unknown protocol error",
49 INVALID_TRANSFORM: "Invalid transform",
50 INVALID_PROTOCOL: "Invalid protocol",
51 UNSUPPORTED_CLIENT_TYPE: "Unsupported client type",
52}
53
Matteo Scandoloa4285862020-12-01 18:10:10 -080054// Application level Thrift exception
55type TApplicationException interface {
56 TException
57 TypeId() int32
David K. Bainbridge06631892021-08-19 13:07:00 +000058 Read(ctx context.Context, iprot TProtocol) error
59 Write(ctx context.Context, oprot TProtocol) error
Matteo Scandoloa4285862020-12-01 18:10:10 -080060}
61
62type tApplicationException struct {
63 message string
64 type_ int32
65}
66
David K. Bainbridge06631892021-08-19 13:07:00 +000067var _ TApplicationException = (*tApplicationException)(nil)
68
69func (tApplicationException) TExceptionType() TExceptionType {
70 return TExceptionTypeApplication
71}
72
Matteo Scandoloa4285862020-12-01 18:10:10 -080073func (e tApplicationException) Error() string {
David K. Bainbridge06631892021-08-19 13:07:00 +000074 if e.message != "" {
75 return e.message
76 }
77 return defaultApplicationExceptionMessage[e.type_]
Matteo Scandoloa4285862020-12-01 18:10:10 -080078}
79
80func NewTApplicationException(type_ int32, message string) TApplicationException {
81 return &tApplicationException{message, type_}
82}
83
84func (p *tApplicationException) TypeId() int32 {
85 return p.type_
86}
87
David K. Bainbridge06631892021-08-19 13:07:00 +000088func (p *tApplicationException) Read(ctx context.Context, iprot TProtocol) error {
89 // TODO: this should really be generated by the compiler
90 _, err := iprot.ReadStructBegin(ctx)
Matteo Scandoloa4285862020-12-01 18:10:10 -080091 if err != nil {
David K. Bainbridge06631892021-08-19 13:07:00 +000092 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -080093 }
94
95 message := ""
96 type_ := int32(UNKNOWN_APPLICATION_EXCEPTION)
97
98 for {
David K. Bainbridge06631892021-08-19 13:07:00 +000099 _, ttype, id, err := iprot.ReadFieldBegin(ctx)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800100 if err != nil {
David K. Bainbridge06631892021-08-19 13:07:00 +0000101 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800102 }
103 if ttype == STOP {
104 break
105 }
106 switch id {
107 case 1:
108 if ttype == STRING {
David K. Bainbridge06631892021-08-19 13:07:00 +0000109 if message, err = iprot.ReadString(ctx); err != nil {
110 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800111 }
112 } else {
David K. Bainbridge06631892021-08-19 13:07:00 +0000113 if err = SkipDefaultDepth(ctx, iprot, ttype); err != nil {
114 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800115 }
116 }
117 case 2:
118 if ttype == I32 {
David K. Bainbridge06631892021-08-19 13:07:00 +0000119 if type_, err = iprot.ReadI32(ctx); err != nil {
120 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800121 }
122 } else {
David K. Bainbridge06631892021-08-19 13:07:00 +0000123 if err = SkipDefaultDepth(ctx, iprot, ttype); err != nil {
124 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800125 }
126 }
127 default:
David K. Bainbridge06631892021-08-19 13:07:00 +0000128 if err = SkipDefaultDepth(ctx, iprot, ttype); err != nil {
129 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800130 }
131 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000132 if err = iprot.ReadFieldEnd(ctx); err != nil {
133 return err
Matteo Scandoloa4285862020-12-01 18:10:10 -0800134 }
135 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000136 if err := iprot.ReadStructEnd(ctx); err != nil {
137 return err
138 }
139
140 p.message = message
141 p.type_ = type_
142
143 return nil
Matteo Scandoloa4285862020-12-01 18:10:10 -0800144}
145
David K. Bainbridge06631892021-08-19 13:07:00 +0000146func (p *tApplicationException) Write(ctx context.Context, oprot TProtocol) (err error) {
147 err = oprot.WriteStructBegin(ctx, "TApplicationException")
Matteo Scandoloa4285862020-12-01 18:10:10 -0800148 if len(p.Error()) > 0 {
David K. Bainbridge06631892021-08-19 13:07:00 +0000149 err = oprot.WriteFieldBegin(ctx, "message", STRING, 1)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800150 if err != nil {
151 return
152 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000153 err = oprot.WriteString(ctx, p.Error())
Matteo Scandoloa4285862020-12-01 18:10:10 -0800154 if err != nil {
155 return
156 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000157 err = oprot.WriteFieldEnd(ctx)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800158 if err != nil {
159 return
160 }
161 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000162 err = oprot.WriteFieldBegin(ctx, "type", I32, 2)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800163 if err != nil {
164 return
165 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000166 err = oprot.WriteI32(ctx, p.type_)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800167 if err != nil {
168 return
169 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000170 err = oprot.WriteFieldEnd(ctx)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800171 if err != nil {
172 return
173 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000174 err = oprot.WriteFieldStop(ctx)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800175 if err != nil {
176 return
177 }
David K. Bainbridge06631892021-08-19 13:07:00 +0000178 err = oprot.WriteStructEnd(ctx)
Matteo Scandoloa4285862020-12-01 18:10:10 -0800179 return
180}