| 564 | // OpSrv::StandardizeServer implementation |
| 565 | template <class Q, class P, concepts::SupportedServer<Q, P> Func> |
| 566 | constexpr auto OpSrv::StandardizeServer(Func&& cb) { |
| 567 | using namespace concepts; |
| 568 | using ServerFunc = std::function<aimrt::co::Task<aimrt::rpc::Status>(aimrt::rpc::ContextRef, const Q&, P&)>; |
| 569 | |
| 570 | // Handle coroutine types (already return Task<Status>) |
| 571 | if constexpr (ServerCoroutineWithCtx<decltype(cb), Q, P>) { |
| 572 | return ServerFunc(std::forward<Func>(cb)); |
| 573 | } else if constexpr (ServerCoroutine<decltype(cb), Q, P>) { |
| 574 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 575 | aimrt::rpc::ContextRef, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 576 | return callback(q, p); |
| 577 | }); |
| 578 | } else if constexpr (ServerCoroutineReturnVoidWithCtx<decltype(cb), Q, P>) { |
| 579 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 580 | aimrt::rpc::ContextRef ctx, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 581 | co_await callback(ctx, q, p); |
| 582 | co_return aimrt::rpc::Status(); |
| 583 | }); |
| 584 | } else if constexpr (ServerCoroutineReturnVoid<decltype(cb), Q, P>) { |
| 585 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 586 | aimrt::rpc::ContextRef, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 587 | co_await callback(q, p); |
| 588 | co_return aimrt::rpc::Status(); |
| 589 | }); |
| 590 | } |
| 591 | // Handle synchronous function types (wrap in coroutine) |
| 592 | else if constexpr (ServerFunctionWithCtx<decltype(cb), Q, P>) { |
| 593 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 594 | aimrt::rpc::ContextRef ctx, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 595 | co_return callback(ctx, q, p); |
| 596 | }); |
| 597 | } else if constexpr (ServerFunctionReturnVoidWithCtx<decltype(cb), Q, P>) { |
| 598 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 599 | aimrt::rpc::ContextRef ctx, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 600 | callback(ctx, q, p); |
| 601 | co_return aimrt::rpc::Status(); |
| 602 | }); |
| 603 | } else if constexpr (ServerFunction<decltype(cb), Q, P>) { |
| 604 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 605 | aimrt::rpc::ContextRef, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 606 | co_return callback(q, p); |
| 607 | }); |
| 608 | } else if constexpr (ServerFunctionReturnVoid<decltype(cb), Q, P>) { |
| 609 | return ServerFunc([callback = std::forward<Func>(cb)]( |
| 610 | aimrt::rpc::ContextRef, const Q& q, P& p) -> aimrt::co::Task<aimrt::rpc::Status> { |
| 611 | callback(q, p); |
| 612 | co_return aimrt::rpc::Status(); |
| 613 | }); |
| 614 | } else { |
| 615 | static_assert(sizeof(decltype(cb)) == 0, "Unsupported server callback type."); |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | } // namespace aimrt::context |
| 620 | |