/** @file * @author Edouard DUPIN * @copyright 2016, Edouard DUPIN, all right reserved * @license APACHE v2.0 (see license file) */ #pragma once #include #include #include #include #include namespace jus { class Client; class ServiceRemote { private: jus::Client* m_clientInterface; std::string m_name; public: ServiceRemote(jus::Client* _clientInterface, const std::string& _name); ~ServiceRemote(); private: ejson::Object callJson(const ejson::Object& _obj); ejson::Object createBaseCall(const std::string& _functionName); void createParam(ejson::Object& _obj) { // Finish recursive parse ... } template void createParam(ejson::Object& _obj, const char* _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); if (_param == nullptr) { array.add(ejson::String()); } else { array.add(ejson::String(_param)); } createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const std::string& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); array.add(ejson::String(_param)); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const bool& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); array.add(ejson::Boolean(_param)); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const int32_t& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); array.add(ejson::Number(_param)); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const double& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); array.add(ejson::Number(_param)); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const float& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); array.add(ejson::Number(_param)); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const std::vector& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); ejson::Array array2; for (auto& it : _param) { array2.add(ejson::String(it)); } array.add(array2); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const std::vector& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); ejson::Array array2; for (const auto& it : _param) { array2.add(ejson::Boolean(it)); } array.add(array2); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const std::vector& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); ejson::Array array2; for (auto& it : _param) { array2.add(ejson::Number(it)); } array.add(array2); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const std::vector& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); ejson::Array array2; for (auto& it : _param) { array2.add(ejson::Number(it)); } array.add(array2); createParam(_obj, std::forward<_ARGS>(_args)...); } template void createParam(ejson::Object& _obj, const std::vector& _param, _ARGS&&... _args) { ejson::Array array = _obj["param"].toArray(); ejson::Array array2; for (auto& it : _param) { array2.add(ejson::Number(it)); } array.add(array2); createParam(_obj, std::forward<_ARGS>(_args)...); } public: template void call(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } } template int32_t call_i(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return 0; } if (val.isNumber() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'"); return 0; } return int32_t(val.toNumber().get()); } template double call_d(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return 0.0; } if (val.isNumber() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'"); return 0.0; } return val.toNumber().get(); } template std::string call_s(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return ""; } if (val.isString() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'String'"); return ""; } return val.toString().get(); } template bool call_b(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return false; } if (val.isBoolean() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Boolean'"); return false; } return val.toBoolean().get(); } template std::vector call_vi(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } if (obj.valueExist("return") == false) { JUS_WARNING("No Return value ..."); return std::vector(); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return std::vector(); } if (val.isArray() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'"); return std::vector(); } std::vector out; for (auto it : val.toArray()) { if (val.isNumber() == false) { JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'"); continue; } out.push_back(int32_t(val.toNumber().get())); } return out; } template std::vector call_vd(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } if (obj.valueExist("return") == false) { JUS_WARNING("No Return value ..."); return std::vector(); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return std::vector(); } if (val.isArray() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'"); return std::vector(); } std::vector out; for (auto it : val.toArray()) { if (it.isNumber() == false) { JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'"); continue; } out.push_back(it.toNumber().get()); } return out; } template std::vector call_vs(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } if (obj.valueExist("return") == false) { JUS_WARNING("No Return value ..."); return std::vector(); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return std::vector(); } if (val.isArray() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'"); return std::vector(); } std::vector out; for (auto it : val.toArray()) { if (it.isString() == false) { JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'String'"); continue; } out.push_back(it.toString().get()); } return out; } template std::vector call_vb(const std::string& _functionName, _ARGS&&... _args) { ejson::Object callElem = createBaseCall(_functionName); createParam(callElem, std::forward<_ARGS>(_args)...); ejson::Object obj = callJson(callElem); if (obj.valueExist("error") == true) { JUS_WARNING("call error: " << obj["error"]); } if (obj.valueExist("return") == false) { JUS_WARNING("No Return value ..."); return std::vector(); } ejson::Value val = obj["return"]; if (val.exist() == false) { JUS_WARNING("No Return value ..."); return std::vector(); } if (val.isArray() == false) { JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'"); return std::vector(); } std::vector out; for (auto it : val.toArray()) { if (it.isBoolean() == false) { JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Boolean'"); continue; } out.push_back(it.toBoolean().get()); } return out; } }; }