|  | /* | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements. See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership. The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License. You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied. See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | */ | 
|  |  | 
|  | import Foundation | 
|  |  | 
|  |  | 
|  | public extension TProtocol { | 
|  |  | 
|  | public func readMessageBegin() throws -> (String, TMessageType, Int) { | 
|  |  | 
|  | var name : NSString? | 
|  | var type : Int32 = -1 | 
|  | var sequenceID : Int32 = -1 | 
|  |  | 
|  | try readMessageBeginReturningName(&name, type: &type, sequenceID: &sequenceID) | 
|  |  | 
|  | return (name as String!, TMessageType(rawValue: type)!, Int(sequenceID)) | 
|  | } | 
|  |  | 
|  | public func writeMessageBeginWithName(name: String, type: TMessageType, sequenceID: Int) throws { | 
|  | try writeMessageBeginWithName(name, type: type.rawValue, sequenceID: Int32(sequenceID)) | 
|  | } | 
|  |  | 
|  | public func readStructBegin() throws -> (String?) { | 
|  |  | 
|  | var name : NSString? = nil | 
|  |  | 
|  | try readStructBeginReturningName(&name) | 
|  |  | 
|  | return (name as String?) | 
|  | } | 
|  |  | 
|  | public func readFieldBegin() throws -> (String?, TType, Int) { | 
|  |  | 
|  | var name : NSString? = nil | 
|  | var type : Int32 = -1 | 
|  | var fieldID : Int32 = -1 | 
|  |  | 
|  | try readFieldBeginReturningName(&name, type: &type, fieldID: &fieldID) | 
|  |  | 
|  | return (name as String?, TType(rawValue: type)!, Int(fieldID)) | 
|  | } | 
|  |  | 
|  | public func writeFieldBeginWithName(name: String, type: TType, fieldID: Int) throws { | 
|  | try writeFieldBeginWithName(name, type: type.rawValue, fieldID: Int32(fieldID)) | 
|  | } | 
|  |  | 
|  | public func readMapBegin() throws -> (TType, TType, Int32) { | 
|  |  | 
|  | var keyType : Int32 = -1 | 
|  | var valueType : Int32 = -1 | 
|  | var size : Int32 = 0 | 
|  |  | 
|  | try readMapBeginReturningKeyType(&keyType, valueType: &valueType, size: &size) | 
|  |  | 
|  | return (TType(rawValue: keyType)!, TType(rawValue: valueType)!, size) | 
|  | } | 
|  |  | 
|  | public func writeMapBeginWithKeyType(keyType: TType, valueType: TType, size: Int) throws { | 
|  | try writeMapBeginWithKeyType(keyType.rawValue, valueType: valueType.rawValue, size: Int32(size)) | 
|  | } | 
|  |  | 
|  | public func readSetBegin() throws -> (TType, Int32) { | 
|  |  | 
|  | var elementType : Int32 = -1 | 
|  | var size : Int32 = 0 | 
|  |  | 
|  | try readSetBeginReturningElementType(&elementType, size: &size) | 
|  |  | 
|  | return (TType(rawValue: elementType)!, size) | 
|  | } | 
|  |  | 
|  | public func writeSetBeginWithElementType(elementType: TType, size: Int) throws { | 
|  | try writeSetBeginWithElementType(elementType.rawValue, size: Int32(size)) | 
|  | } | 
|  |  | 
|  | public func readListBegin() throws -> (TType, Int32) { | 
|  |  | 
|  | var elementType : Int32 = -1 | 
|  | var size : Int32 = 0 | 
|  |  | 
|  | try readListBeginReturningElementType(&elementType, size: &size) | 
|  |  | 
|  | return (TType(rawValue: elementType)!, size) | 
|  | } | 
|  |  | 
|  | public func writeListBeginWithElementType(elementType: TType, size: Int) throws { | 
|  | try writeListBeginWithElementType(elementType.rawValue, size: Int32(size)) | 
|  | } | 
|  |  | 
|  | public func writeFieldValue<T: TSerializable>(value: T, name: String, type: TType, id: Int32) throws { | 
|  | try writeFieldBeginWithName(name, type: type.rawValue, fieldID: id) | 
|  | try writeValue(value) | 
|  | try writeFieldEnd() | 
|  | } | 
|  |  | 
|  | public func readValue<T: TSerializable>() throws -> T { | 
|  | return try T.readValueFromProtocol(self) | 
|  | } | 
|  |  | 
|  | public func writeValue<T: TSerializable>(value: T) throws { | 
|  | try T.writeValue(value, toProtocol: self) | 
|  | } | 
|  |  | 
|  | public func readResultMessageBegin() throws { | 
|  |  | 
|  | let (_, type, _) = try readMessageBegin(); | 
|  |  | 
|  | if type == .EXCEPTION { | 
|  | let x = try readException() | 
|  | throw x | 
|  | } | 
|  |  | 
|  | return | 
|  | } | 
|  |  | 
|  | public func validateValue(value: Any?, named name: String) throws { | 
|  |  | 
|  | if value == nil { | 
|  | throw NSError( | 
|  | domain: TProtocolErrorDomain, | 
|  | code: Int(TProtocolError.Unknown.rawValue), | 
|  | userInfo: [TProtocolErrorFieldNameKey: name]) | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | public func readException() throws -> ErrorType { | 
|  |  | 
|  | var reason : String? | 
|  | var type = TApplicationError.Unknown | 
|  |  | 
|  | try readStructBegin() | 
|  |  | 
|  | fields: while (true) { | 
|  |  | 
|  | let (_, fieldType, fieldID) = try readFieldBegin() | 
|  |  | 
|  | switch (fieldID, fieldType) { | 
|  | case (_, .STOP): | 
|  | break fields | 
|  |  | 
|  | case (1, .STRING): | 
|  | reason = try readValue() as String | 
|  |  | 
|  | case (2, .I32): | 
|  | let typeVal = try readValue() as Int32 | 
|  | if let tmp = TApplicationError(rawValue: typeVal) { | 
|  | type = tmp | 
|  | } | 
|  |  | 
|  | case let (_, unknownType): | 
|  | try skipType(unknownType) | 
|  | } | 
|  |  | 
|  | try readFieldEnd() | 
|  | } | 
|  |  | 
|  | try readStructEnd() | 
|  |  | 
|  | return NSError(type:type, reason:reason ?? "") | 
|  | } | 
|  |  | 
|  | public func writeExceptionForMessageName(name: String, sequenceID: Int, ex: NSError) throws { | 
|  | try writeMessageBeginWithName(name, type: .EXCEPTION, sequenceID: sequenceID) | 
|  | try ex.write(self) | 
|  | try writeMessageEnd() | 
|  | } | 
|  |  | 
|  | public func skipType(type: TType) throws { | 
|  | try TProtocolUtil.skipType(type.rawValue, onProtocol: self) | 
|  | } | 
|  |  | 
|  | } |