This commit is contained in:
2022-02-02 02:26:17 +03:00
parent 352930961f
commit 2123554ad7

View File

@@ -35,6 +35,18 @@ class JsonRpcException(Exception):
return json.dumps(self.as_dict())
class Method:
def __init__(self, function = None, handler = None, fields = None):
self.function = function
self.handler = handler
self.fields = fields
def __call__(self, queries):
if self.handler is None:
return self.function()
return self.function()
class JSONRPC:
"""Основной класс JSON-RPC
"""
@@ -85,7 +97,7 @@ class JSONRPC:
return None
func = self.methods[name]
sig = signature(func)
params = {}
params = None
for key in sig.parameters:
params[key] = ''
result = {
@@ -119,29 +131,32 @@ class JSONRPC:
"""Выполнение метода
"""
self.validate(query)
method = query['method']
if method not in self.methods:
name = query['method']
if name not in self.methods:
return JsonRpcException(
query['id'],
METHOD_NOT_FOUND,
f'Метод не найден: {method}'
f'Метод не найден: {name}'
).as_dict()
func = self.methods[method]
method = self.methods[name]
if 'params' not in query:
params = {}
else:
params = None
if 'params' in query:
params = query['params']
# for key in params:
# print(f'{key}: {type(params[key]).__name__} = {params[key]}')
logging.debug('params: {}'.format(params))
logging.debug('params: {}'.format(params))
try:
if isinstance(params, (tuple, set, list)):
response = func(*params)
if method.handler is None:
pass
if isinstance(params, list):
response = method.function(*params)
elif isinstance(params, dict):
response = func(**params)
response = method.function(**params)
elif isinstance(params, NoneType):
response = method.function()
else:
return JsonRpcException(
query['id'],
@@ -185,8 +200,9 @@ class JSONRPC:
def __len__(self):
return len(self.methods)
def __setitem__(self, key, value):
self.methods[key] = value
def __setitem__(self, key, function, handler = None, fields = None):
method = Method(function = function, handler = None, fields = None)
self.methods[key] = function
def __delitem__(self, key):
del self.methods[key]