mirror of
https://github.com/valitydev/thrift.git
synced 2024-11-07 10:48:51 +00:00
282 lines
6.6 KiB
Lua
282 lines
6.6 KiB
Lua
--
|
|
-- 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.
|
|
--
|
|
|
|
---- namespace thrift
|
|
--thrift = {}
|
|
--setmetatable(thrift, {__index = _G}) --> perf hit for accessing global methods
|
|
--setfenv(1, thrift)
|
|
|
|
package.cpath = package.cpath .. ';bin/?.so' -- TODO FIX
|
|
function ttype(obj)
|
|
if type(obj) == 'table' and
|
|
obj.__type and
|
|
type(obj.__type) == 'string' then
|
|
return obj.__type
|
|
end
|
|
return type(obj)
|
|
end
|
|
|
|
function terror(e)
|
|
if e and e.__tostring then
|
|
error(e:__tostring())
|
|
return
|
|
end
|
|
error(e)
|
|
end
|
|
|
|
function ttable_size(t)
|
|
local count = 0
|
|
for k, v in pairs(t) do
|
|
count = count + 1
|
|
end
|
|
return count
|
|
end
|
|
|
|
version = 1.0
|
|
|
|
TType = {
|
|
STOP = 0,
|
|
VOID = 1,
|
|
BOOL = 2,
|
|
BYTE = 3,
|
|
I08 = 3,
|
|
DOUBLE = 4,
|
|
I16 = 6,
|
|
I32 = 8,
|
|
I64 = 10,
|
|
STRING = 11,
|
|
UTF7 = 11,
|
|
STRUCT = 12,
|
|
MAP = 13,
|
|
SET = 14,
|
|
LIST = 15,
|
|
UTF8 = 16,
|
|
UTF16 = 17
|
|
}
|
|
|
|
TMessageType = {
|
|
CALL = 1,
|
|
REPLY = 2,
|
|
EXCEPTION = 3,
|
|
ONEWAY = 4
|
|
}
|
|
|
|
-- Recursive __index function to achieve inheritance
|
|
function __tobj_index(self, key)
|
|
local v = rawget(self, key)
|
|
if v ~= nil then
|
|
return v
|
|
end
|
|
|
|
local p = rawget(self, '__parent')
|
|
if p then
|
|
return __tobj_index(p, key)
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
-- Basic Thrift-Lua Object
|
|
__TObject = {
|
|
__type = '__TObject',
|
|
__mt = {
|
|
__index = __tobj_index
|
|
}
|
|
}
|
|
function __TObject:new(init_obj)
|
|
local obj = {}
|
|
if ttype(obj) == 'table' then
|
|
obj = init_obj
|
|
end
|
|
|
|
-- Use the __parent key and the __index function to achieve inheritance
|
|
obj.__parent = self
|
|
setmetatable(obj, __TObject.__mt)
|
|
return obj
|
|
end
|
|
|
|
-- Return a string representation of any lua variable
|
|
function thrift_print_r(t)
|
|
local ret = ''
|
|
local ltype = type(t)
|
|
if (ltype == 'table') then
|
|
ret = ret .. '{ '
|
|
for key,value in pairs(t) do
|
|
ret = ret .. tostring(key) .. '=' .. thrift_print_r(value) .. ' '
|
|
end
|
|
ret = ret .. '}'
|
|
elseif ltype == 'string' then
|
|
ret = ret .. "'" .. tostring(t) .. "'"
|
|
else
|
|
ret = ret .. tostring(t)
|
|
end
|
|
return ret
|
|
end
|
|
|
|
-- Basic Exception
|
|
TException = __TObject:new{
|
|
message,
|
|
errorCode,
|
|
__type = 'TException'
|
|
}
|
|
function TException:__tostring()
|
|
if self.message then
|
|
return string.format('%s: %s', self.__type, self.message)
|
|
else
|
|
local message
|
|
if self.errorCode and self.__errorCodeToString then
|
|
message = string.format('%d: %s', self.errorCode, self:__errorCodeToString())
|
|
else
|
|
message = thrift_print_r(self)
|
|
end
|
|
return string.format('%s:%s', self.__type, message)
|
|
end
|
|
end
|
|
|
|
TApplicationException = TException:new{
|
|
UNKNOWN = 0,
|
|
UNKNOWN_METHOD = 1,
|
|
INVALID_MESSAGE_TYPE = 2,
|
|
WRONG_METHOD_NAME = 3,
|
|
BAD_SEQUENCE_ID = 4,
|
|
MISSING_RESULT = 5,
|
|
INTERNAL_ERROR = 6,
|
|
PROTOCOL_ERROR = 7,
|
|
INVALID_TRANSFORM = 8,
|
|
INVALID_PROTOCOL = 9,
|
|
UNSUPPORTED_CLIENT_TYPE = 10,
|
|
errorCode = 0,
|
|
__type = 'TApplicationException'
|
|
}
|
|
|
|
function TApplicationException:__errorCodeToString()
|
|
if self.errorCode == self.UNKNOWN_METHOD then
|
|
return 'Unknown method'
|
|
elseif self.errorCode == self.INVALID_MESSAGE_TYPE then
|
|
return 'Invalid message type'
|
|
elseif self.errorCode == self.WRONG_METHOD_NAME then
|
|
return 'Wrong method name'
|
|
elseif self.errorCode == self.BAD_SEQUENCE_ID then
|
|
return 'Bad sequence ID'
|
|
elseif self.errorCode == self.MISSING_RESULT then
|
|
return 'Missing result'
|
|
elseif self.errorCode == self.INTERNAL_ERROR then
|
|
return 'Internal error'
|
|
elseif self.errorCode == self.PROTOCOL_ERROR then
|
|
return 'Protocol error'
|
|
elseif self.errorCode == self.INVALID_TRANSFORM then
|
|
return 'Invalid transform'
|
|
elseif self.errorCode == self.INVALID_PROTOCOL then
|
|
return 'Invalid protocol'
|
|
elseif self.errorCode == self.UNSUPPORTED_CLIENT_TYPE then
|
|
return 'Unsupported client type'
|
|
else
|
|
return 'Default (unknown)'
|
|
end
|
|
end
|
|
|
|
function TException:read(iprot)
|
|
iprot:readStructBegin()
|
|
while true do
|
|
local fname, ftype, fid = iprot:readFieldBegin()
|
|
if ftype == TType.STOP then
|
|
break
|
|
elseif fid == 1 then
|
|
if ftype == TType.STRING then
|
|
self.message = iprot:readString()
|
|
else
|
|
iprot:skip(ftype)
|
|
end
|
|
elseif fid == 2 then
|
|
if ftype == TType.I32 then
|
|
self.errorCode = iprot:readI32()
|
|
else
|
|
iprot:skip(ftype)
|
|
end
|
|
else
|
|
iprot:skip(ftype)
|
|
end
|
|
iprot:readFieldEnd()
|
|
end
|
|
iprot:readStructEnd()
|
|
end
|
|
|
|
function TException:write(oprot)
|
|
oprot:writeStructBegin('TApplicationException')
|
|
if self.message then
|
|
oprot:writeFieldBegin('message', TType.STRING, 1)
|
|
oprot:writeString(self.message)
|
|
oprot:writeFieldEnd()
|
|
end
|
|
if self.errorCode then
|
|
oprot:writeFieldBegin('type', TType.I32, 2)
|
|
oprot:writeI32(self.errorCode)
|
|
oprot:writeFieldEnd()
|
|
end
|
|
oprot:writeFieldStop()
|
|
oprot:writeStructEnd()
|
|
end
|
|
|
|
-- Basic Client (used in generated lua code)
|
|
__TClient = __TObject:new{
|
|
__type = '__TClient',
|
|
_seqid = 0
|
|
}
|
|
function __TClient:new(obj)
|
|
if ttype(obj) ~= 'table' then
|
|
error('TClient must be initialized with a table')
|
|
end
|
|
|
|
-- Set iprot & oprot
|
|
if obj.protocol then
|
|
obj.iprot = obj.protocol
|
|
obj.oprot = obj.protocol
|
|
obj.protocol = nil
|
|
elseif not obj.iprot then
|
|
error('You must provide ' .. ttype(self) .. ' with an iprot')
|
|
end
|
|
if not obj.oprot then
|
|
obj.oprot = obj.iprot
|
|
end
|
|
|
|
return __TObject.new(self, obj)
|
|
end
|
|
|
|
function __TClient:close()
|
|
self.iprot.trans:close()
|
|
self.oprot.trans:close()
|
|
end
|
|
|
|
-- Basic Processor (used in generated lua code)
|
|
__TProcessor = __TObject:new{
|
|
__type = '__TProcessor'
|
|
}
|
|
function __TProcessor:new(obj)
|
|
if ttype(obj) ~= 'table' then
|
|
error('TProcessor must be initialized with a table')
|
|
end
|
|
|
|
-- Ensure a handler is provided
|
|
if not obj.handler then
|
|
error('You must provide ' .. ttype(self) .. ' with a handler')
|
|
end
|
|
|
|
return __TObject.new(self, obj)
|
|
end
|