mirror of
https://github.com/haiwen/libsearpc.git
synced 2025-04-27 18:25:06 +00:00
52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
import json
|
|
|
|
from .common import SearpcError
|
|
|
|
class SearpcService(object):
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self.func_table = {}
|
|
|
|
class SearpcServer(object):
|
|
def __init__(self):
|
|
self.services = {}
|
|
|
|
def create_service(self, svcname):
|
|
service = SearpcService(svcname)
|
|
self.services[svcname] = service
|
|
|
|
def register_function(self, svcname, fn, fname=None):
|
|
service = self.services[svcname]
|
|
if fname == None:
|
|
fname = fn.__name__
|
|
service.func_table[fname] = fn
|
|
|
|
def _call_function(self, svcname, fcallstr):
|
|
"""input str -> output str"""
|
|
try:
|
|
argv = json.loads(fcallstr)
|
|
except Exception as e:
|
|
raise SearpcError('bad call str: ' + str(e))
|
|
|
|
service = self.services[svcname]
|
|
|
|
fname = argv[0]
|
|
fn = service.func_table.get(fname, None)
|
|
if fn is None:
|
|
raise SearpcError('No such funtion %s' % fname)
|
|
|
|
ret = fn(*argv[1:])
|
|
return ret
|
|
|
|
def call_function(self, svcname, fcallstr):
|
|
try:
|
|
retVal = self._call_function(svcname, fcallstr)
|
|
except Exception as e:
|
|
ret = {'err_code': 555, 'err_msg': str(e)}
|
|
else:
|
|
ret = {'ret': retVal}
|
|
|
|
return json.dumps(ret)
|
|
|
|
searpc_server = SearpcServer()
|