FastLED 3.9.15
Loading...
Searching...
No Matches
typed_rpc_binding.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/stl/json.h"
4#include "fl/stl/stdint.h"
5#include "fl/stl/tuple.h"
6#include "fl/stl/function.h"
11
12namespace fl {
13
14// =============================================================================
15// TypedRpcBinding - Wraps a typed function for RPC invocation
16// =============================================================================
17
18template <typename Signature>
20
21// Specialization for void return type
22template <typename... Args>
23class TypedRpcBinding<void(Args...)> {
24public:
25 using FunctionType = fl::function<void(Args...)>;
26 using Converter = JsonArgConverter<void(Args...)>;
27 using StorageTuple = typename Converter::args_tuple; // Stripped types for storage
28
30
31 TypeConversionResult invoke(const json& jsonArgs) {
32 // C++11 compatible: avoid structured bindings
33 fl::tuple<StorageTuple, TypeConversionResult> convTuple = Converter::convert(jsonArgs);
34 StorageTuple tuple = fl::get<0>(convTuple);
36 if (!result.ok()) {
37 return result;
38 }
39 invokeImpl(tuple, make_index_sequence<sizeof...(Args)>{});
40 return result;
41 }
42
43private:
44 template <fl::size... Is>
46 // fl::get returns T& from tuple<T>, which converts to const T& for const ref parameters
48 }
49
51};
52
53// Specialization for non-void return type
54template <typename R, typename... Args>
55class TypedRpcBinding<R(Args...)> {
56public:
57 using FunctionType = fl::function<R(Args...)>;
58 using Converter = JsonArgConverter<R(Args...)>;
59 using StorageTuple = typename Converter::args_tuple; // Stripped types for storage
60
62
63 TypeConversionResult invoke(const json& jsonArgs) {
64 // C++11 compatible: avoid structured bindings
65 fl::tuple<StorageTuple, TypeConversionResult> convTuple = Converter::convert(jsonArgs);
66 StorageTuple tuple = fl::get<0>(convTuple);
68 if (!result.ok()) {
69 return result;
70 }
71 invokeImpl(tuple, make_index_sequence<sizeof...(Args)>{});
72 return result;
73 }
74
76 // C++11 compatible: avoid structured bindings
77 fl::tuple<StorageTuple, TypeConversionResult> convTuple = Converter::convert(jsonArgs);
78 StorageTuple tuple = fl::get<0>(convTuple);
80 if (!result.ok()) {
81 return fl::make_tuple(result, json(nullptr));
82 }
83 R returnValue = invokeImplWithReturn(tuple, make_index_sequence<sizeof...(Args)>{});
84 json jsonResult = detail::TypeToJson<R>::convert(returnValue);
85 return fl::make_tuple(result, jsonResult);
86 }
87
88private:
89 template <fl::size... Is>
91 // fl::get returns T& from tuple<T>, which converts to const T& for const ref parameters
93 }
94
95 template <fl::size... Is>
97 // fl::get returns T& from tuple<T>, which converts to const T& for const ref parameters
98 return mFunction(fl::get<Is>(args)...);
99 }
100
102};
103
104} // namespace fl
fl::tuple< TypeConversionResult, json > invokeWithReturn(const json &jsonArgs)
R invokeImplWithReturn(StorageTuple &args, index_sequence< Is... >)
JsonArgConverter< R(Args...)> Converter
void invokeImpl(StorageTuple &args, index_sequence< Is... >)
fl::function< R(Args...)> FunctionType
typename Converter::args_tuple StorageTuple
TypeConversionResult invoke(const json &jsonArgs)
typename Converter::args_tuple StorageTuple
JsonArgConverter< void(Args...)> Converter
TypeConversionResult invoke(const json &jsonArgs)
void invokeImpl(StorageTuple &args, index_sequence< Is... >)
fl::function< void(Args...)> FunctionType
FastLED's Elegant JSON Library: fl::json
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
typename make_index_sequence_impl< N >::type make_index_sequence
pair_element< I, T1, T2 >::type & get(pair< T1, T2 > &p) FL_NOEXCEPT
Definition pair.h:115
Base definition for an LED controller.
Definition crgb.hpp:179
corkscrew_args args
Definition old.h:149
static json convert(const T &value)