8 #ifndef __NANO_RPC_CORE_SERVER_H__
9 #define __NANO_RPC_CORE_SERVER_H__
18 #include <type_traits>
36 template<
class T,
class U >
37 constexpr
bool is_same_v = std::is_same<T, U>::value;
39 template <
typename TPacker>
43 template <
typename TFunc>
44 void handle(std::string name, TFunc func)
49 template <
typename TFunc>
54 throw std::invalid_argument{
"[" + std::string{__func__ } +
"] Failed to add handler. "
62 using arguments_tuple_type =
typename function_meta::arguments_tuple_type;
63 arguments_tuple_type
data;
66 apply(std::move(func), std::move(
data), response);
69 handlers_.emplace(std::move(
id), std::move(wrapper));
76 throw exception::server{
"[nanorpc::core::server::execute] No handlers."};
80 auto request = packer.from_buffer(std::move(
buffer));
83 version::core::protocol::value_type
protocol{};
85 if (
protocol != version::core::protocol::value)
87 throw exception::server{
"[nanorpc::core::server::execute] Unsupported protocol version \"" +
94 request = request.unpack(
type);
96 throw exception::server{
"[nanorpc::core::server::execute] Bad response type."};
100 request = request.unpack(function_id);
102 auto response = packer
103 .pack(version::core::protocol::value)
106 auto const iter =
handlers_.find(function_id);
108 throw exception::server{
"[nanorpc::core::server::execute] Function not found."};
112 iter->second(request, response);
114 catch (std::exception
const &e)
121 return response.to_buffer();
123 catch (std::exception
const &e)
126 .pack(version::core::protocol::value)
142 template <
typename TFunc,
typename TArgs>
144 std::enable_if_t<!is_same_v<std::decay_t< decltype( invoke_hpp::apply(std::declval<TFunc>(), std::declval<TArgs>()) ) >,
void>,
void>
147 auto data = invoke_hpp::apply(std::move(func), std::move(args));
149 serializer = serializer.pack(
data);
152 template <
typename TFunc,
typename TArgs>
154 std::enable_if_t<is_same_v< std::decay_t< decltype( invoke_hpp::apply(std::declval<TFunc>(), std::declval<TArgs>()) ) > ,
void>,
void>
157 invoke_hpp::apply(std::move(func), std::move(args));
166 #endif // !__NANO_RPC_CORE_SERVER_H__