FastLED 3.10.8
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#include "fl/stl/noexcept.h"
12
13namespace fl {
14
15// =============================================================================
16// TypedRpcBinding - Wraps a typed function for RPC invocation
17// =============================================================================
18
19template <typename Signature>
21
22// Specialization for void return type
23template <typename... Args>
24class TypedRpcBinding<void(Args...)> {
25public:
26 using FunctionType = fl::function<void(Args...)>;
27 using Converter = JsonArgConverter<void(Args...)>;
28 using StorageTuple = typename Converter::args_tuple; // Stripped types for storage
29
31
33 // C++11 compatible: avoid structured bindings
34 fl::tuple<StorageTuple, TypeConversionResult> convTuple = Converter::convert(jsonArgs);
35 StorageTuple tuple = fl::get<0>(convTuple);
37 if (!result.ok()) {
38 return result;
39 }
40 invokeImpl(tuple, make_index_sequence<sizeof...(Args)>{});
41 return result;
42 }
43
44private:
45 template <fl::size... Is>
47 // fl::get returns T& from tuple<T>, which converts to const T& for const ref parameters
49 }
50
52};
53
54// Specialization for non-void return type
55template <typename R, typename... Args>
56class TypedRpcBinding<R(Args...)> {
57public:
58 using FunctionType = fl::function<R(Args...)>;
59 using Converter = JsonArgConverter<R(Args...)>;
60 using StorageTuple = typename Converter::args_tuple; // Stripped types for storage
61
63
65 // C++11 compatible: avoid structured bindings
66 fl::tuple<StorageTuple, TypeConversionResult> convTuple = Converter::convert(jsonArgs);
67 StorageTuple tuple = fl::get<0>(convTuple);
69 if (!result.ok()) {
70 return result;
71 }
72 invokeImpl(tuple, make_index_sequence<sizeof...(Args)>{});
73 return result;
74 }
75
77 // C++11 compatible: avoid structured bindings
78 fl::tuple<StorageTuple, TypeConversionResult> convTuple = Converter::convert(jsonArgs);
79 StorageTuple tuple = fl::get<0>(convTuple);
81 if (!result.ok()) {
82 return fl::make_tuple(result, json(nullptr));
83 }
84 R returnValue = invokeImplWithReturn(tuple, make_index_sequence<sizeof...(Args)>{});
85 json jsonResult = detail::TypeToJson<R>::convert(returnValue);
86 return fl::make_tuple(result, jsonResult);
87 }
88
89private:
90 template <fl::size... Is>
92 // fl::get returns T& from tuple<T>, which converts to const T& for const ref parameters
94 }
95
96 template <fl::size... Is>
98 // fl::get returns T& from tuple<T>, which converts to const T& for const ref parameters
99 return mFunction(fl::get<Is>(args)...);
100 }
101
103};
104
105} // namespace fl
R invokeImplWithReturn(StorageTuple &args, index_sequence< Is... >) FL_NO_EXCEPT
TypedRpcBinding(FunctionType fn) FL_NO_EXCEPT
fl::tuple< TypeConversionResult, json > invokeWithReturn(const json &jsonArgs) FL_NO_EXCEPT
JsonArgConverter< R(Args...)> Converter
TypeConversionResult invoke(const json &jsonArgs) FL_NO_EXCEPT
fl::function< R(Args...)> FunctionType
typename Converter::args_tuple StorageTuple
void invokeImpl(StorageTuple &args, index_sequence< Is... >) FL_NO_EXCEPT
TypeConversionResult invoke(const json &jsonArgs) FL_NO_EXCEPT
void invokeImpl(StorageTuple &args, index_sequence< Is... >) FL_NO_EXCEPT
typename Converter::args_tuple StorageTuple
JsonArgConverter< void(Args...)> Converter
TypedRpcBinding(FunctionType fn) FL_NO_EXCEPT
fl::function< void(Args...)> FunctionType
FastLED's Elegant JSON Library: fl::json
tuple< typename fl::decay< Ts >::type... > make_tuple(Ts &&... args) FL_NO_EXCEPT
Definition tuple.h:106
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31
pair_element< I, T1, T2 >::type & get(pair< T1, T2 > &p) FL_NO_EXCEPT
Definition pair.h:119
typename make_index_sequence_impl< N >::type make_index_sequence
Base definition for an LED controller.
Definition crgb.hpp:179
corkscrew_args args
Definition old.h:149
static json convert(const T &value) FL_NO_EXCEPT