C++ Implementation for JsonRPC 2.0 (oriented on websockets)
Got information about this protocol here https://www.simple-is-better.org/json-rpc/jsonrpc20.html But used not all standart
- Collect all handlers for jsonrpc20
- Including system of define validators
- Can generate client library on python (Include control pypi files)
$ wsjcpp install https://github.com/wsjcpp/wsjcpp-jsonrpc20:master
- src.wsjcpp/nlohmann_json/json.hpp
- src.wsjcpp/wsjcpp_core/wsjcpp_core.h
- src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp
- src.wsjcpp/wsjcpp_validators/wsjcpp_validators.h
- src.wsjcpp/wsjcpp_validators/wsjcpp_validators.cpp
- src/wsjcpp_jsonrpc20.h
- src/wsjcpp_jsonrpc20.cpp
- src/wsjcpp_jsonrpc20_export_cli_base.h
- src/wsjcpp_jsonrpc20_export_cli_base.cpp
- src/wsjcpp_jsonrpc20_export_cli_python.h
- src/wsjcpp_jsonrpc20_export_cli_python.cpp
- src/wsjcpp_jsonrpc20_export_cli_webjs.h
- src/wsjcpp_jsonrpc20_export_cli_webjs.cpp
$ wsjcpp generate WsjcppJsonRpc20Handler GameCreate
Will be generated new files
- ./src/wsjcpp_json_rpc20_handler_game_create.h
- ./src/wsjcpp_json_rpc20_handler_game_create.cpp
And automaticly included to CMakeLists.txt between #### BEGIN_WSJCPP_APPEND and #### END_WSJCPP_APPEND
Like this:
#### BEGIN_WSJCPP_APPEND
list (APPEND WSJCPP_SOURCES "./src/wsjcpp_json_rpc20_handler_game_create.h")
list (APPEND WSJCPP_SOURCES "./src/wsjcpp_json_rpc20_handler_game_create.cpp")
#### END_WSJCPP_APPEND
They will contains class WsjcppJsonRpc20HandlerGameCreate with method game_create
File ./src/wsjcpp_json_rpc20_handler_game_create.h:
#ifndef WSJCPP_JSON_RPC20_HANDLER_GAME_CREATE_H #define WSJCPP_JSON_RPC20_HANDLER_GAME_CREATE_H #include <wsjcpp_jsonrpc20.h> class WsjcppJsonRpc20HandlerGameCreate : public WsjcppJsonRpc20HandlerBase { public: WsjcppJsonRpc20HandlerGameCreate(); virtual void handle(WsjcppJsonRpc20Request *pRequest) override; }; #endif // WSJCPP_JSON_RPC20_HANDLER_GAME_CREATE_H
File ./src/wsjcpp_json_rpc20_handler_game_create.cpp:
#include "wsjcpp_json_rpc20_handler_game_create.h" #include <wsjcpp_core.h> #include <wsjcpp_jsonrpc20.h> // --------------------------------------------------------------------- // WsjcppJsonRpc20HandlerGameCreate WsjcppJsonRpc20HandlerGameCreate::WsjcppJsonRpc20HandlerGameCreate() : WsjcppJsonRpc20HandlerBase("game_create", "TODO description") { TAG = "WsjcppJsonRpc20HandlerGameCreate"; // setAccessUnauthorized(true); // setAccessUser(true); // setAccessTester(true); // setAccessAdmin(true); // void setActivatedFromVersion("v0.0.1"); // TODO authomatic set WSJCPP_APP_VERSION // void setDeprecatedFromVersion(""); // description of input params // requireStringParam("uuid", "object uuid") // .addValidator(new WsjcppValidatorUUID()); // optionalStringParam("name", "Name of object") // .addValidator(new WsjcppValidatorStringLength(3,10)); // requireIntegerParam("cost", "Name of object") // .addValidator(new WsjcppValidatorIntegerMinValue(3)) // .addValidator(new WsjcppValidatorIntegerMaxValue(1000)); // optionalIntegerParam("age", "Name of object") // .addValidator(new WsjcppValidatorIntegerMinValue(0)) // requireBooleanParam("public", "True if object is public"); // optionalBooleanParam("activated", "If object can handle"); } // --------------------------------------------------------------------- void WsjcppJsonRpc20HandlerGameCreate::handle(WsjcppJsonRpc20Request *pRequest) { WsjcppLog::err(TAG, "Not implemented"); // TODO pRequest->fail(WsjcppJsonRpc20Error(501, "NOT_IMPLEMENTED")); }
#include <wsjcpp_jsonrpc20_export_cli_python.h> #include <iostream> ... void main() { std::string sExportDir = "./example-of-exported-client-libraries"; WsjcppJsonRpc20ExportCliPython exportCliPython( "./example-of-exported/py3", "libwsjcppjson20client" ); exportCliPython.setAuthorName("Evgenii Sopov"); exportCliPython.setAuthorEmail("[email protected]"); exportCliPython.setAppName(std::string(WSJCPP_APP_NAME)); exportCliPython.setAppVersion(std::string(WSJCPP_APP_VERSION)); exportCliPython.setClassName("SomeClient"); exportCliPython.setUrl("https://github.com/user/repo"); exportCliPython.setDownloadUrl("https://github.com/user/repo/archive/" + std::string(WSJCPP_APP_NAME) + ".tar.gz");; exportCliPython.setKeywords({std::string(WSJCPP_APP_NAME), "wsjcpp", "wsjcpp-jsonrpc20", "example-python-client"}); exportCliPython.addLoginMethod("auth_login", "token"); exportCliPython.addLoginMethod("auth_token", "token"); exportCliPython.addLogoffMethod("auth_logoff"); if (!exportCliPython.doExportLib()) { std::cout << "Failed!" << std::endl; } else { std::cout << "Success!" << std::endl; } }
Usefull (official docs): https://packaging.python.org/tutorials/packaging-projects/
In next step you need:
$ cd ./example-of-exported/py3
$ python3 setup.py sdist bdist_wheel
... here will prepared dist/* directory
$ twine check dist/*
Checking dist/libwsjcppjson20client-0.0.2-py3-none-any.whl: PASSED
Checking dist/libwsjcppjson20client-0.0.2.tar.gz: PASSED
$ python3 -m pip install --user --upgrade twine
$ python3 -m twine upload dist/*
... here you need registered account on pypi