codec.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #ifndef REST_RPC_CODEC_H_
  2. #define REST_RPC_CODEC_H_
  3. #include <msgpack.hpp>
  4. namespace rest_rpc {
  5. namespace rpc_service {
  6. using buffer_type = msgpack::sbuffer;
  7. struct msgpack_codec {
  8. const static size_t init_size = 2 * 1024;
  9. template<typename... Args>
  10. static buffer_type pack_args(Args&&... args) {
  11. buffer_type buffer(init_size);
  12. msgpack::pack(buffer, std::forward_as_tuple(std::forward<Args>(args)...));
  13. return buffer;
  14. }
  15. template<typename Arg, typename... Args,
  16. typename = typename std::enable_if<std::is_enum<Arg>::value>::type>
  17. static std::string pack_args_str(Arg arg, Args&&... args) {
  18. buffer_type buffer(init_size);
  19. msgpack::pack(buffer, std::forward_as_tuple((int)arg, std::forward<Args>(args)...));
  20. return std::string(buffer.data(), buffer.size());
  21. }
  22. template<typename T>
  23. buffer_type pack(T&& t) const {
  24. buffer_type buffer;
  25. msgpack::pack(buffer, std::forward<T>(t));
  26. return buffer;
  27. }
  28. template<typename T>
  29. T unpack(char const* data, size_t length) {
  30. try {
  31. msgpack::unpack(&msg_, data, length);
  32. return msg_.get().as<T>();
  33. } catch (...) { throw std::invalid_argument("unpack failed: Args not match!"); }
  34. }
  35. private:
  36. msgpack::unpacked msg_;
  37. };
  38. } // namespace rpc_service
  39. } // namespace rest_rpc
  40. #endif // REST_RPC_CODEC_H_