🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
CommandDispatcher.hpp
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "CommandUtil.hpp"
25#include "CommandRouting.hpp"
26
27
28AST_NAMESPACE_BEGIN
29
38class AST_CMD_API CommandDispatcher
39{
40public:
41 using CommandHandlerMap = std::unordered_map<std::string, std::shared_ptr<CommandHandler>>;
42 explicit CommandDispatcher(bool whetherInit);
43 CommandDispatcher() = default;
44 ~CommandDispatcher() = default;
45 errc_t execute(StringView command, CommandResult& result) const;
46 void addRuleHandler(StringView tmpl, std::shared_ptr<CommandHandler> handler);
47 CommandTrie::Node& addRule(StringView tmpl);
48private:
49 CommandTrie trie_;
50};
51
52
53#ifndef SWIG
54
55template <typename F, typename Tuple>
57{
58public:
59 explicit TaggedRule(F f)
60 : handler_(std::move(f))
61 {}
62
63 errc_t handle(const CommandParams& params, CommandResult& result) const override {
64 if (params.size() != std::tuple_size<Tuple>::value) {
65 aError("invalid param count");
66 return eErrorInvalidParam;
67 }
68 return call(params, result, Tuple{});
69 }
70private:
71 // 展开 tuple<arg_pair<Pos,Type>...>
72 template <typename... Args>
73 errc_t call(const CommandParams& params, CommandResult& result, std::tuple<Args...>) const {
74 result.clear();
75 try {
76 // 调用 handler,并通过 fill_result 自动分发返回值
77 return detail::fill_result(result,
78 handler_(detail::convert_token<typename Args::type>(params[Args::pos])...));
79 }
80 catch(std::exception& e) {
81 result.push_back(e.what());
82 return eErrorInvalidParam;
83 }
84 catch (...) {
85 return static_cast<errc_t>(-1); // 异常统一返回 -1
86 }
87 }
88private:
89 F handler_;
90};
91
92
93
94// 新建命令处理器:使用 integral_constant 技巧绕过 decltype(lambda) 的未计算上下文限制
95template <typename F, uint64_t Tag, int N>
96std::shared_ptr<CommandHandler> makeCommandHandler(
97 F handler,
98 std::integral_constant<uint64_t, Tag>,
99 std::integral_constant<int, N>
100)
101{
102 using ArgTuple = detail::decode_tag<Tag, N>;
103 return std::make_shared<TaggedRule<F, ArgTuple>>(std::move(handler));
104}
105
106template<uint64_t Tag, int N>
108{
109public:
110 CommandTrieNodeWrap(CommandTrie::Node& node) : node_(node) {}
111
112 template<typename F>
113 void operator()(F f)
114 {
115 node_.handler_ = makeCommandHandler(std::move(f), std::integral_constant<uint64_t, Tag>{}, std::integral_constant<int, N>{});
116 }
117private:
118 CommandTrie::Node& node_;
119};
120
121#endif
122
123#define _AST_REGISTER_COMMAND(dispatcher, cmd_template, handler) \
124 { \
125 constexpr uint64_t tag = detail::get_parameter_tag(cmd_template); \
126 constexpr int n = detail::count_args(cmd_template); \
127 (dispatcher).addRuleHandler(cmd_template, makeCommandHandler(handler, \
128 std::integral_constant<uint64_t, tag>{}, \
129 std::integral_constant<int, n>{})); \
130 }
131
132
133#define REGISTER_COMMAND(dispatcher, cmd_template, handler) \
134 _AST_REGISTER_COMMAND(dispatcher, cmd_template, handler)
135
136
137#define COMMAND_RULE(dispatcher, cmd_template) CommandTrieNodeWrap<detail::get_parameter_tag(cmd_template), detail::count_args(cmd_template)>(dispatcher.addRule(cmd_template))
138
139
142AST_NAMESPACE_END
定义 CommandDispatcher.hpp:39
命令处理接口
定义 CommandRouting.hpp:50
命令参数
定义 CommandRouting.hpp:42
定义 CommandAPI.hpp:37
定义 CommandDispatcher.hpp:108
定义 CommandRouting.hpp:81
路由树
定义 CommandRouting.hpp:78
定义 CommandDispatcher.hpp:57
errc_t handle(const CommandParams &params, CommandResult &result) const override
定义 CommandDispatcher.hpp:63