// 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. using Thrift.Protocols.Entities; namespace Thrift.Protocols.Utilities { // ReSharper disable once InconsistentNaming public static class TJSONProtocolHelper { public static byte[] GetTypeNameForTypeId(TType typeId) { switch (typeId) { case TType.Bool: return TJSONProtocolConstants.TypeNames.NameBool; case TType.Byte: return TJSONProtocolConstants.TypeNames.NameByte; case TType.I16: return TJSONProtocolConstants.TypeNames.NameI16; case TType.I32: return TJSONProtocolConstants.TypeNames.NameI32; case TType.I64: return TJSONProtocolConstants.TypeNames.NameI64; case TType.Double: return TJSONProtocolConstants.TypeNames.NameDouble; case TType.String: return TJSONProtocolConstants.TypeNames.NameString; case TType.Struct: return TJSONProtocolConstants.TypeNames.NameStruct; case TType.Map: return TJSONProtocolConstants.TypeNames.NameMap; case TType.Set: return TJSONProtocolConstants.TypeNames.NameSet; case TType.List: return TJSONProtocolConstants.TypeNames.NameList; default: throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized exType"); } } public static TType GetTypeIdForTypeName(byte[] name) { var result = TType.Stop; if (name.Length > 1) { switch (name[0]) { case (byte) 'd': result = TType.Double; break; case (byte) 'i': switch (name[1]) { case (byte) '8': result = TType.Byte; break; case (byte) '1': result = TType.I16; break; case (byte) '3': result = TType.I32; break; case (byte) '6': result = TType.I64; break; } break; case (byte) 'l': result = TType.List; break; case (byte) 'm': result = TType.Map; break; case (byte) 'r': result = TType.Struct; break; case (byte) 's': if (name[1] == (byte) 't') { result = TType.String; } else if (name[1] == (byte) 'e') { result = TType.Set; } break; case (byte) 't': result = TType.Bool; break; } } if (result == TType.Stop) { throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized exType"); } return result; } /// /// Return true if the given byte could be a valid part of a JSON number. /// public static bool IsJsonNumeric(byte b) { switch (b) { case (byte)'+': case (byte)'-': case (byte)'.': case (byte)'0': case (byte)'1': case (byte)'2': case (byte)'3': case (byte)'4': case (byte)'5': case (byte)'6': case (byte)'7': case (byte)'8': case (byte)'9': case (byte)'E': case (byte)'e': return true; default: return false; } } /// /// Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its /// corresponding hex value /// public static byte ToHexVal(byte ch) { if (ch >= '0' && ch <= '9') { return (byte)((char)ch - '0'); } if (ch >= 'a' && ch <= 'f') { ch += 10; return (byte)((char)ch - 'a'); } throw new TProtocolException(TProtocolException.INVALID_DATA, "Expected hex character"); } /// /// Convert a byte containing a hex value to its corresponding hex character /// public static byte ToHexChar(byte val) { val &= 0x0F; if (val < 10) { return (byte)((char)val + '0'); } val -= 10; return (byte)((char)val + 'a'); } } }