FastLED 3.9.15
Loading...
Searching...
No Matches
response_aware_binding.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/stl/json.h"
4#include "fl/stl/function.h"
5#include "fl/stl/tuple.h"
10
11namespace fl {
12namespace detail {
13
14// =============================================================================
15// ResponseAwareInvoker - Invokes response-aware functions (with ResponseSend&)
16// =============================================================================
17
31
32// Forward declaration
33template<typename Sig>
35
36// Specialization for non-void return types
37template<typename R, typename... Args>
38class ResponseAwareInvoker<R(Args...)> : public ErasedInvoker {
39public:
41 const fl::json& requestId,
42 fl::function<void(const fl::json&)> responseSink)
43 : mFn(fl::move(fn)), mRequestId(requestId), mResponseSink(fl::move(responseSink)) {}
44
46 // Create ResponseSend instance
48
49 // Use TypedRpcBinding to convert JSON params to C++ args (without ResponseSend&)
50 TypedRpcBinding<R(Args...)> binding([this, &responseSend](Args... cppArgs) -> R {
51 // Invoke user function with ResponseSend& + converted args
52 return mFn(responseSend, fl::forward<Args>(cppArgs)...);
53 });
54
55 return binding.invokeWithReturn(args);
56 }
57
58private:
62};
63
64// Specialization for void return type
65template<typename... Args>
66class ResponseAwareInvoker<void(Args...)> : public ErasedInvoker {
67public:
69 const fl::json& requestId,
70 fl::function<void(const fl::json&)> responseSink)
71 : mFn(fl::move(fn)), mRequestId(requestId), mResponseSink(fl::move(responseSink)) {}
72
74 // Create ResponseSend instance
76
77 // Use TypedRpcBinding to convert JSON params to C++ args (without ResponseSend&)
78 TypedRpcBinding<void(Args...)> binding([this, &responseSend](Args... cppArgs) -> void {
79 // Invoke user function with ResponseSend& + converted args
80 mFn(responseSend, fl::forward<Args>(cppArgs)...);
81 });
82
83 TypeConversionResult result = binding.invoke(args);
84 return fl::make_tuple(result, json(nullptr));
85 }
86
87private:
88 fl::function<void(ResponseSend&, Args...)> mFn;
91};
92
93} // namespace detail
94} // namespace fl
int requestId
Helper class for sending responses in async/streaming RPC methods.
ResponseAwareInvoker(fl::function< R(ResponseSend &, Args...)> fn, const fl::json &requestId, fl::function< void(const fl::json &)> responseSink)
fl::tuple< TypeConversionResult, json > invoke(const json &args) override
fl::function< R(ResponseSend &, Args...)> mFn
fl::function< void(const fl::json &)> mResponseSink
fl::function< void(const fl::json &)> mResponseSink
ResponseAwareInvoker(fl::function< void(ResponseSend &, Args...)> fn, const fl::json &requestId, fl::function< void(const fl::json &)> responseSink)
fl::tuple< TypeConversionResult, json > invoke(const json &args) override
fl::function< void(ResponseSend &, Args...)> mFn
FastLED's Elegant JSON Library: fl::json
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_traits.h:48
Invoker for response-aware RPC methods.
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
Definition move.h:28
tuple< typename fl::decay< Ts >::type... > make_tuple(Ts &&... args) FL_NOEXCEPT
Definition tuple.h:104
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31
Base definition for an LED controller.
Definition crgb.hpp:179
corkscrew_args args
Definition old.h:149