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 
20 
21 /// TErrorCode
22 ///
23 /// Protocol for TError conformers' enum's to conform to.
24 /// Generic Int Thrift error code to allow error cases to have
25 /// associated values.
26 public protocol TErrorCode : CustomStringConvertible {
27   var thriftErrorCode: Int { get }
28 }
29 
30 /// TError
31 ///
32 /// Base protocol for all Thrift Error(Exception) types to conform to
33 public protocol TError : Error, CustomStringConvertible {
34 
35   /// Enum for error cases.  Can be typealiased to any conforming enum
36   /// or defined nested.
37   associatedtype Code: TErrorCode
38 
39   /// Error Case, value from internal enum
40   var error: Code { get set }
41 
42   /// Optional additional message
43   var message: String? { get set }
44 
45   /// Default error case for the error type, used for generic init()
46   static var defaultCase: Code { get }
47 
48   init()
49 }
50 
51 extension TError {
52   /// Human readable description of error. Default provided for you in the
53   /// format \(Self.self): \(error.errorDescription) \n message
54   /// eg:
55   ///
56   ///     TApplicationError (1): Invalid Message Type
57   ///     An unknown Error has occured.
58   public var description: String {
59     var out = "\(Self.self) (\(error.thriftErrorCode)): " + error.description + "\n"
60     if let message = message {
61       out += "Message: \(message)"
62     }
63     return out
64   }
65 
66   /// Simple default Initializer for TError's
67   ///
68   /// - parameter error:   ErrorCode value.  Default: defaultCase
69   /// - parameter message: Custom message with error.  Optional
70   ///
71   /// - returns: <#return value description#>
72   public init(error: Code, message: String? = nil) {
73     self.init()
74     self.error = error
75     self.message = message
76   }
77 }
78