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