-module(protoMsg). -export([encode/1, decode/1, encodeRec/1, decodeRec/2]). -define(min8, -128). -define(max8, 127). -define(min16, -32768). -define(max16, 32767). -define(min32, -2147483648). -define(max32, 2147483647). -define(min64, -9223372036854775808). -define(max64, 9223372036854775807). -define(minF32, -3.4E+38). -define(maxF32, 3.4E+38). -define(minF64, -1.797E-308). -define(maxF64, 1.797E+308). -define(int8(V), <>). -define(uint8(V), <>). -define(int16(V), <>). -define(uint16(V), <>). -define(int32(V), <>). -define(uint32(V), <>). -define(int64(V), <>). -define(uint64(V), <>). -define(integer(V), (integer(V))). -define(number(V), (number(V))). -define(string(V), (string(V))). -define(float(V), <>). -define(double(V), <>). -define(bool(V), (case V of true -> <<1:8>>; _ -> <<0:8>> end)). -define(record(V), (case V of undefined -> [<<0:8>>]; V -> [<<1:8>>, encodeRec(V)] end)). -define(list_bool(List), [<<(length(List)):16/big>>, [?bool(V) || V <- List]]). -define(list_int8(List), [<<(length(List)):16/big>>, [?int8(V) || V <- List]]). -define(list_uint8(List), [<<(length(List)):16/big>>, [?uint8(V) || V <- List]]). -define(list_int16(List), [<<(length(List)):16/big>>, [?int16(V) || V <- List]]). -define(list_uint16(List), [<<(length(List)):16/big>>, [?uint16(V) || V <- List]]). -define(list_int32(List), [<<(length(List)):16/big>>, [?int32(V) || V <- List]]). -define(list_uint32(List), [<<(length(List)):16/big>>, [?uint32(V) || V <- List]]). -define(list_int64(List), [<<(length(List)):16/big>>, [?int64(V) || V <- List]]). -define(list_uint64(List), [<<(length(List)):16/big>>, [?uint64(V) || V <- List]]). -define(list_float(List), [<<(length(List)):16/big>>, [?float(V) || V <- List]]). -define(list_double(List), [<<(length(List)):16/big>>, [?double(V) || V <- List]]). -define(list_integer(List), [<<(length(List)):16/big>>, [integer(V) || V <- List]]). -define(list_number(List), [<<(length(List)):16/big>>, [number(V) || V <- List]]). -define(list_string(List), [<<(length(List)):16/big>>, [string(V) || V <- List]]). -define(list_record(List), [<<(length(List)):16/big>>, [encodeRec(V) || V <- List]]). integer(V) -> if V >= ?min8 andalso V =< ?max8 -> <<8:8, <>/binary>>; V >= ?min16 andalso V =< ?max16 -> <<16:8, <>/binary>>; V >= ?min32 andalso V =< ?max32 -> <<32:8, <>/binary>>; V >= ?min64 andalso V =< ?max64 -> <<64:8, <>/binary>>; true -> throw(exceeded_the_integer) end. numInteger(V) -> if V >= ?min8 andalso V =< ?max8 -> <<8:8, <>/binary>>; V >= ?min16 andalso V =< ?max16 -> <<16:8, <>/binary>>; V >= ?min32 andalso V =< ?max32 -> <<32:8, <>/binary>>; V >= ?min64 andalso V =< ?max64 -> <<64:8, <>/binary>>; true -> throw(exceeded_the_integer) end. numFloat(V) -> if V >= ?minF32 andalso V =< ?maxF32 -> <<33:8, <>/binary>>; V >= ?minF64 andalso V =< ?maxF64 -> <<65:8, <>/binary>>; true -> throw(exceeded_the_float) end. number(V) -> if erlang:is_integer(V) == true -> numInteger(V); erlang:is_float(V) == true -> numFloat(V); true -> throw(is_not_number) end. string(Str) when is_binary(Str) -> [<<(byte_size(Str)):16/big>>, Str]; string(Str) -> Str2 = unicode:characters_to_binary(Str, utf8), [<<(byte_size(Str2)):16/big>>, Str2]. encode(Record) -> MsgBin = encodeRec(Record), MsgId = getMsgId(element(1, Record)), [<>, MsgBin]. decode(Bin) -> <> = Bin, SchList = getMsgSchema(MsgId), {<<>>, ResultList} = decodeField(SchList, MsgBin, [getMsgType(MsgId)]), list_to_tuple(ResultList). decodeRec(RecordName, Bin) -> SchList = getMsgSchema(RecordName), {LeftBin, Result} = decodeField(SchList, Bin, [RecordName]), {LeftBin, list_to_tuple(Result)}. decodeField([], LeftBin, Result) -> {LeftBin, lists:reverse(Result)}; decodeField([Type | SchList], MsgBin, Result) -> case Type of int32 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); uint32 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); string -> <> = MsgBin, decodeField(SchList, LeftBin, [StrBin | Result]); int16 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); uint16 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); int8 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); uint8 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); int64 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); uint64 -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); integer -> <> = MsgBin, decodeField(SchList, LeftBin, [Int | Result]); number -> <> = MsgBin, case NumBits of 33 -> <> = NumBin, decodeField(SchList, LeftBin, [Float | Result]); 65 -> <> = NumBin, decodeField(SchList, LeftBin, [Float | Result]); _ -> <> = NumBin, decodeField(SchList, LeftBin, [Int | Result]) end; bool -> <> = MsgBin, case Bool =:= 1 of true -> decodeField(SchList, LeftBin, [true | Result]); _ -> decodeField(SchList, LeftBin, [false | Result]) end; float -> <> = MsgBin, decodeField(SchList, LeftBin, [Float | Result]); double -> <> = MsgBin, decodeField(SchList, LeftBin, [Float | Result]); {list, int32} -> <> = MsgBin, {LeftBin, RetList} = deInt32List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, uint32} -> <> = MsgBin, {LeftBin, RetList} = deUint32List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, int16} -> <> = MsgBin, {LeftBin, RetList} = deInt16List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, uint16} -> <> = MsgBin, {LeftBin, RetList} = deUint16List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, int8} -> <> = MsgBin, {LeftBin, RetList} = deInt8List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, uint8} -> <> = MsgBin, {LeftBin, RetList} = deUint8List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, string} -> <> = MsgBin, {LeftBin, RetList} = deStringList(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, int64} -> <> = MsgBin, {LeftBin, RetList} = deInt64List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, uint64} -> <> = MsgBin, {LeftBin, RetList} = deUint64List(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, integer} -> <> = MsgBin, {LeftBin, RetList} = deIntegerList(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, number} -> <> = MsgBin, {LeftBin, RetList} = deNumberList(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, bool} -> <> = MsgBin, {LeftBin, RetList} = deBoolList(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, float} -> <> = MsgBin, {LeftBin, RetList} = deFloatList(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, double} -> <> = MsgBin, {LeftBin, RetList} = deDoubleList(Len, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); {list, RecordName} -> <> = MsgBin, {LeftBin, RetList} = deRecordList(Len, RecordName, LeftListBin, []), decodeField(SchList, LeftBin, [RetList | Result]); RecordName -> <> = MsgBin, case IsUndef of 0 -> decodeField(SchList, LeftBin, [undefined | Result]); _ -> SubSchList = getMsgSchema(RecordName), {SubLeftBin, SubResultList} = decodeField(SubSchList, LeftBin, [RecordName]), decodeField(SchList, SubLeftBin, [list_to_tuple(SubResultList) | Result]) end end. deBoolList(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deBoolList(N, MsgBin, RetList) -> <> = MsgBin, case Bool =:= 1 of true -> deBoolList(N - 1, LeftBin, [true | RetList]); _ -> deBoolList(N - 1, LeftBin, [false | RetList]) end. deInt8List(0, MsgBin, RetList) -> {MsgBin, RetList}; deInt8List(N, MsgBin, RetList) -> <> = MsgBin, deInt8List(N - 1, LeftBin, [Int | RetList]). deUint8List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deUint8List(N, MsgBin, RetList) -> <> = MsgBin, deUint8List(N - 1, LeftBin, [Int | RetList]). deInt16List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deInt16List(N, MsgBin, RetList) -> <> = MsgBin, deInt16List(N - 1, LeftBin, [Int | RetList]). deUint16List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deUint16List(N, MsgBin, RetList) -> <> = MsgBin, deUint16List(N - 1, LeftBin, [Int | RetList]). deInt32List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deInt32List(N, MsgBin, RetList) -> <> = MsgBin, deInt32List(N - 1, LeftBin, [Int | RetList]). deUint32List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deUint32List(N, MsgBin, RetList) -> <> = MsgBin, deUint32List(N - 1, LeftBin, [Int | RetList]). deInt64List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deInt64List(N, MsgBin, RetList) -> <> = MsgBin, deInt64List(N - 1, LeftBin, [Int | RetList]). deUint64List(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deUint64List(N, MsgBin, RetList) -> <> = MsgBin, deUint64List(N - 1, LeftBin, [Int | RetList]). deIntegerList(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deIntegerList(N, MsgBin, RetList) -> <> = MsgBin, deIntegerList(N - 1, LeftBin, [Int | RetList]). deNumberList(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deNumberList(N, MsgBin, RetList) -> <> = MsgBin, case NumBits of 33 -> <> = NumBin, deNumberList(N - 1, LeftBin, [Float | RetList]); 65 -> <> = NumBin, deNumberList(N - 1, LeftBin, [Float | RetList]); _ -> <> = NumBin, deNumberList(N - 1, LeftBin, [Int | RetList]) end. deFloatList(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deFloatList(N, MsgBin, RetList) -> <> = MsgBin, deFloatList(N - 1, LeftBin, [Float | RetList]). deDoubleList(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deDoubleList(N, MsgBin, RetList) -> <> = MsgBin, deDoubleList(N - 1, LeftBin, [Float | RetList]). deStringList(0, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deStringList(N, MsgBin, RetList) -> <> = MsgBin, deStringList(N - 1, LeftBin, [StrBin | RetList]). deRecordList(0, _RecordName, MsgBin, RetList) -> {MsgBin, lists:reverse(RetList)}; deRecordList(N, RecordName, MsgBin, RetList) -> {LeftBin, Tuple} = decodeRec(RecordName, MsgBin), deRecordList(N - 1, RecordName, LeftBin, [Tuple | RetList]). getMsgType(1)-> test; getMsgType(2)-> phoneNumber; getMsgType(3)-> person; getMsgType(4)-> addressBook; getMsgType(5)-> union; getMsgType(6)-> tbool; getMsgType(7)-> tint8; getMsgType(8)-> tuint8; getMsgType(9)-> tint16; getMsgType(10)-> tuint16; getMsgType(11)-> tint32; getMsgType(12)-> tuint32; getMsgType(13)-> tint64; getMsgType(14)-> tuint64; getMsgType(15)-> tinteger; getMsgType(16)-> tnumber; getMsgType(17)-> tfloat; getMsgType(18)-> tdouble; getMsgType(19)-> tstring; getMsgType(20)-> tlistbool; getMsgType(21)-> tlistint8; getMsgType(22)-> tlistuint8; getMsgType(23)-> tlistint16; getMsgType(24)-> tlistuint16; getMsgType(25)-> tlistint32; getMsgType(26)-> tlistuint32; getMsgType(27)-> tlistint64; getMsgType(28)-> tlistuint64; getMsgType(29)-> tlistinteger; getMsgType(30)-> tlistnumber; getMsgType(31)-> tlistfloat; getMsgType(32)-> tlistdouble; getMsgType(33)-> tliststring; getMsgType(34)-> tlistunion; getMsgType(35)-> allType; getMsgType(_) -> undefined. getMsgId(test)-> 1; getMsgId(phoneNumber)-> 2; getMsgId(person)-> 3; getMsgId(addressBook)-> 4; getMsgId(union)-> 5; getMsgId(tbool)-> 6; getMsgId(tint8)-> 7; getMsgId(tuint8)-> 8; getMsgId(tint16)-> 9; getMsgId(tuint16)-> 10; getMsgId(tint32)-> 11; getMsgId(tuint32)-> 12; getMsgId(tint64)-> 13; getMsgId(tuint64)-> 14; getMsgId(tinteger)-> 15; getMsgId(tnumber)-> 16; getMsgId(tfloat)-> 17; getMsgId(tdouble)-> 18; getMsgId(tstring)-> 19; getMsgId(tlistbool)-> 20; getMsgId(tlistint8)-> 21; getMsgId(tlistuint8)-> 22; getMsgId(tlistint16)-> 23; getMsgId(tlistuint16)-> 24; getMsgId(tlistint32)-> 25; getMsgId(tlistuint32)-> 26; getMsgId(tlistint64)-> 27; getMsgId(tlistuint64)-> 28; getMsgId(tlistinteger)-> 29; getMsgId(tlistnumber)-> 30; getMsgId(tlistfloat)-> 31; getMsgId(tlistdouble)-> 32; getMsgId(tliststring)-> 33; getMsgId(tlistunion)-> 34; getMsgId(allType)-> 35; getMsgId(_) -> 0. encodeRec({test, V1}) -> [?string(V1)]; encodeRec({phoneNumber, V1, V2}) -> [?record(V1), ?int32(V2)]; encodeRec({person, V1, V2, V3, V4}) -> [?string(V1), ?int32(V2), ?string(V3), ?list_record(V4)]; encodeRec({addressBook, V1, V2}) -> [?list_record(V1), ?list_record(V2)]; encodeRec({union, V1, V2}) -> [?string(V1), ?int32(V2)]; encodeRec({tbool, V1}) -> [?bool(V1)]; encodeRec({tint8, V1, V2}) -> [?int8(V1), ?int8(V2)]; encodeRec({tuint8, V1, V2}) -> [?uint8(V1), ?uint8(V2)]; encodeRec({tint16, V1, V2}) -> [?int16(V1), ?int16(V2)]; encodeRec({tuint16, V1, V2}) -> [?uint16(V1), ?uint16(V2)]; encodeRec({tint32, V1, V2}) -> [?int32(V1), ?int32(V2)]; encodeRec({tuint32, V1, V2}) -> [?uint32(V1), ?uint32(V2)]; encodeRec({tint64, V1, V2}) -> [?int64(V1), ?int64(V2)]; encodeRec({tuint64, V1, V2}) -> [?uint64(V1), ?uint64(V2)]; encodeRec({tinteger, V1, V2, V3, V4, V5, V6, V7, V8}) -> [?integer(V1), ?integer(V2), ?integer(V3), ?integer(V4), ?integer(V5), ?integer(V6), ?integer(V7), ?integer(V8)]; encodeRec({tnumber, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10}) -> [?number(V1), ?number(V2), ?number(V3), ?number(V4), ?number(V5), ?number(V6), ?number(V7), ?number(V8), ?number(V9), ?number(V10)]; encodeRec({tfloat, V1, V2}) -> [?float(V1), ?float(V2)]; encodeRec({tdouble, V1, V2}) -> [?double(V1), ?double(V2)]; encodeRec({tstring, V1, V2}) -> [?string(V1), ?string(V2)]; encodeRec({tlistbool, V1}) -> [?list_bool(V1)]; encodeRec({tlistint8, V1}) -> [?list_int8(V1)]; encodeRec({tlistuint8, V1}) -> [?list_uint8(V1)]; encodeRec({tlistint16, V1}) -> [?list_int16(V1)]; encodeRec({tlistuint16, V1}) -> [?list_uint16(V1)]; encodeRec({tlistint32, V1}) -> [?list_int32(V1)]; encodeRec({tlistuint32, V1}) -> [?list_uint32(V1)]; encodeRec({tlistint64, V1}) -> [?list_int64(V1)]; encodeRec({tlistuint64, V1}) -> [?list_uint64(V1)]; encodeRec({tlistinteger, V1}) -> [?list_integer(V1)]; encodeRec({tlistnumber, V1}) -> [?list_number(V1)]; encodeRec({tlistfloat, V1}) -> [?list_float(V1)]; encodeRec({tlistdouble, V1}) -> [?list_double(V1)]; encodeRec({tliststring, V1}) -> [?list_string(V1)]; encodeRec({tlistunion, V1}) -> [?list_record(V1)]; encodeRec({allType, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V50, V51, V52, V53, V54, V55}) -> [?bool(V1), ?int8(V2), ?uint8(V3), ?int16(V4), ?uint16(V5), ?int32(V6), ?uint32(V7), ?int64(V8), ?uint64(V9), ?integer(V10), ?integer(V11), ?integer(V12), ?integer(V13), ?integer(V14), ?integer(V15), ?integer(V16), ?integer(V17), ?number(V18), ?number(V19), ?number(V20), ?number(V21), ?number(V22), ?number(V23), ?number(V24), ?number(V25), ?number(V26), ?number(V27), ?float(V28), ?double(V29), ?string(V30), ?string(V31), ?record(V32), ?list_bool(V33), ?list_int8(V34), ?list_uint8(V35), ?list_int16(V36), ?list_uint16(V37), ?list_int32(V38), ?list_uint32(V39), ?list_int64(V40), ?list_uint64(V41), ?list_integer(V42), ?list_integer(V43), ?list_integer(V44), ?list_integer(V45), ?list_number(V46), ?list_number(V47), ?list_number(V48), ?list_number(V49), ?list_number(V50), ?list_number(V51), ?list_float(V52), ?list_double(V53), ?list_string(V54), ?list_record(V55)]; encodeRec(_) -> []. getMsgSchema(test)-> getMsgSchema(1); getMsgSchema(1)-> [string]; getMsgSchema(phoneNumber)-> getMsgSchema(2); getMsgSchema(2)-> [test,int32]; getMsgSchema(person)-> getMsgSchema(3); getMsgSchema(3)-> [string,int32,string,{list,phoneNumber}]; getMsgSchema(addressBook)-> getMsgSchema(4); getMsgSchema(4)-> [{list,person},{list,person}]; getMsgSchema(union)-> getMsgSchema(5); getMsgSchema(5)-> [string,int32]; getMsgSchema(tbool)-> getMsgSchema(6); getMsgSchema(6)-> [bool]; getMsgSchema(tint8)-> getMsgSchema(7); getMsgSchema(7)-> [int8,int8]; getMsgSchema(tuint8)-> getMsgSchema(8); getMsgSchema(8)-> [uint8,uint8]; getMsgSchema(tint16)-> getMsgSchema(9); getMsgSchema(9)-> [int16,int16]; getMsgSchema(tuint16)-> getMsgSchema(10); getMsgSchema(10)-> [uint16,uint16]; getMsgSchema(tint32)-> getMsgSchema(11); getMsgSchema(11)-> [int32,int32]; getMsgSchema(tuint32)-> getMsgSchema(12); getMsgSchema(12)-> [uint32,uint32]; getMsgSchema(tint64)-> getMsgSchema(13); getMsgSchema(13)-> [int64,int64]; getMsgSchema(tuint64)-> getMsgSchema(14); getMsgSchema(14)-> [uint64,uint64]; getMsgSchema(tinteger)-> getMsgSchema(15); getMsgSchema(15)-> [integer,integer,integer,integer,integer,integer,integer,integer]; getMsgSchema(tnumber)-> getMsgSchema(16); getMsgSchema(16)-> [number,number,number,number,number,number,number,number,number,number]; getMsgSchema(tfloat)-> getMsgSchema(17); getMsgSchema(17)-> [float,float]; getMsgSchema(tdouble)-> getMsgSchema(18); getMsgSchema(18)-> [double,double]; getMsgSchema(tstring)-> getMsgSchema(19); getMsgSchema(19)-> [string,string]; getMsgSchema(tlistbool)-> getMsgSchema(20); getMsgSchema(20)-> [{list,bool}]; getMsgSchema(tlistint8)-> getMsgSchema(21); getMsgSchema(21)-> [{list,int8}]; getMsgSchema(tlistuint8)-> getMsgSchema(22); getMsgSchema(22)-> [{list,uint8}]; getMsgSchema(tlistint16)-> getMsgSchema(23); getMsgSchema(23)-> [{list,int16}]; getMsgSchema(tlistuint16)-> getMsgSchema(24); getMsgSchema(24)-> [{list,uint16}]; getMsgSchema(tlistint32)-> getMsgSchema(25); getMsgSchema(25)-> [{list,int32}]; getMsgSchema(tlistuint32)-> getMsgSchema(26); getMsgSchema(26)-> [{list,uint32}]; getMsgSchema(tlistint64)-> getMsgSchema(27); getMsgSchema(27)-> [{list,int64}]; getMsgSchema(tlistuint64)-> getMsgSchema(28); getMsgSchema(28)-> [{list,uint64}]; getMsgSchema(tlistinteger)-> getMsgSchema(29); getMsgSchema(29)-> [{list,integer}]; getMsgSchema(tlistnumber)-> getMsgSchema(30); getMsgSchema(30)-> [{list,number}]; getMsgSchema(tlistfloat)-> getMsgSchema(31); getMsgSchema(31)-> [{list,float}]; getMsgSchema(tlistdouble)-> getMsgSchema(32); getMsgSchema(32)-> [{list,double}]; getMsgSchema(tliststring)-> getMsgSchema(33); getMsgSchema(33)-> [{list,string}]; getMsgSchema(tlistunion)-> getMsgSchema(34); getMsgSchema(34)-> [{list,union}]; getMsgSchema(allType)-> getMsgSchema(35); getMsgSchema(35)-> [bool,int8,uint8,int16,uint16,int32,uint32,int64,uint64,integer,integer, integer,integer,integer,integer,integer,integer,number,number,number,number, number,number,number,number,number,number,float,double,string,string,union, {list,bool}, {list,int8}, {list,uint8}, {list,int16}, {list,uint16}, {list,int32}, {list,uint32}, {list,int64}, {list,uint64}, {list,integer}, {list,integer}, {list,integer}, {list,integer}, {list,number}, {list,number}, {list,number}, {list,number}, {list,number}, {list,number}, {list,float}, {list,double}, {list,string}, {list,union}]; getMsgSchema(_) -> [].