LeviLamina
Loading...
Searching...
No Matches
ParamTraits.h
1#pragma once
2
3#include <cstddef>
4#include <memory>
5#include <stdexcept>
6#include <string>
7#include <string_view>
8#include <type_traits>
9#include <vector>
10
11#include "ll/api/base/StdInt.h"
12#include "ll/api/command/CommandRegistrar.h"
13#include "ll/api/command/EnumName.h"
14#include "ll/api/command/Optional.h"
15#include "ll/api/command/SoftEnum.h"
16
17#include "mc/deps/core/utility/typeid_t.h"
18#include "mc/deps/json/Value.h"
19#include "mc/server/commands/BlockStateCommandParam.h"
20#include "mc/server/commands/Command.h"
21#include "mc/server/commands/CommandBlockName.h"
22#include "mc/server/commands/CommandCompareOperator.h"
23#include "mc/server/commands/CommandFilePath.h"
24#include "mc/server/commands/CommandIntegerRange.h"
25#include "mc/server/commands/CommandItem.h"
26#include "mc/server/commands/CommandMessage.h"
27#include "mc/server/commands/CommandOperator.h"
28#include "mc/server/commands/CommandParameterData.h"
29#include "mc/server/commands/CommandParameterOption.h"
30#include "mc/server/commands/CommandPositionFloat.h"
31#include "mc/server/commands/CommandRawText.h"
32#include "mc/server/commands/CommandWildcardInt.h"
33#include "mc/server/commands/RelativeFloat.h"
34#include "mc/server/commands/WildcardCommandSelector.h"
35#include "mc/world/actor/ActorDefinitionIdentifier.h"
36#include "mc/world/actor/player/Player.h"
37#include "mc/world/effect/MobEffect.h"
38
39namespace ll::command {
40template <class T>
41struct ParamTraits;
42
43template <class T>
45 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::Basic; }
46 static constexpr CommandParameterOption options() { return CommandParameterOption::None; }
47 static inline CommandRegistry::ParseFunction parseFn() { return &CommandRegistry::parse<T>; }
48 static constexpr std::string_view enumNameOrPostfix() { return {}; }
49 static constexpr std::string_view subChain() { return {}; }
50 static CommandRegistry::ParamParseRule const* parseRule() {
51 if constexpr (requires { ParamTraits<T>::parseRuleValue(); }) {
52 static CommandRegistry::ParamParseRule rule = [] {
54 result.parse.get() = ParamTraits<T>::parseFn();
56 return result;
57 }();
58 return &rule;
59 } else {
60 return nullptr;
61 }
62 }
63 static Bedrock::typeid_t<CommandRegistry> typeId() { return Bedrock::type_id<CommandRegistry, T>(); }
64 static constexpr void transformData(CommandParameterData&, CommandRegistrar&) {}
65};
66template <class T>
68template <>
69struct ParamTraits<int> : ParamTraitsBase<int> {
70 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
71 return CommandRegistry::HardNonTerminal::Int;
72 }
73};
74template <>
75struct ParamTraits<float> : ParamTraitsBase<float> {
76 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
77 return CommandRegistry::HardNonTerminal::Val;
78 }
79};
80template <>
81struct ParamTraits<std::string> : ParamTraitsBase<std::string> {
82 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
83 return CommandRegistry::HardNonTerminal::Id;
84 }
85};
86template <>
87struct ParamTraits<CommandOperator> : ParamTraitsBase<CommandOperator> {
88 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
89 return CommandRegistry::HardNonTerminal::Operator;
90 }
91};
92template <>
93struct ParamTraits<CommandCompareOperator> : ParamTraitsBase<CommandCompareOperator> {
94 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
95 return CommandRegistry::HardNonTerminal::CompareOperator;
96 }
97};
98template <>
99struct ParamTraits<RelativeFloat> : ParamTraitsBase<RelativeFloat> {
100 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
101 return CommandRegistry::HardNonTerminal::RVal;
102 }
103};
104template <>
105struct ParamTraits<CommandWildcardInt> : ParamTraitsBase<CommandWildcardInt> {
106 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
107 return CommandRegistry::HardNonTerminal::WildcardInt;
108 }
109};
110template <>
111struct ParamTraits<CommandIntegerRange> : ParamTraitsBase<CommandIntegerRange> {
112 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
113 return CommandRegistry::HardNonTerminal::FullIntegerRange;
114 }
115};
116template <>
117struct ParamTraits<CommandFilePath> : ParamTraitsBase<CommandFilePath> {
118 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
119 return CommandRegistry::HardNonTerminal::FilePath;
120 }
121};
122template <>
123struct ParamTraits<CommandPosition> : ParamTraitsBase<CommandPosition> {
124 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
125 return CommandRegistry::HardNonTerminal::Position;
126 }
127};
128template <>
129struct ParamTraits<CommandPositionFloat> : ParamTraitsBase<CommandPositionFloat> {
130 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
131 return CommandRegistry::HardNonTerminal::PositionFloat;
132 }
133};
134template <>
135struct ParamTraits<CommandSelector<Actor>> : ParamTraitsBase<CommandSelector<Actor>> {
136 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
137 return CommandRegistry::HardNonTerminal::Selection;
138 }
139};
140template <>
141struct ParamTraits<CommandSelector<Player>> : ParamTraitsBase<CommandSelector<Player>> {
142 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
143 return CommandRegistry::HardNonTerminal::Selection;
144 }
145};
146template <>
147struct ParamTraits<WildcardCommandSelector<Actor>> : ParamTraitsBase<WildcardCommandSelector<Actor>> {
148 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
149 return CommandRegistry::HardNonTerminal::WildcardSelection;
150 }
151};
152template <>
153struct ParamTraits<CommandMessage> : ParamTraitsBase<CommandMessage> {
154 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
155 return CommandRegistry::HardNonTerminal::MessageRoot;
156 }
157};
158template <>
159struct ParamTraits<CommandRawText> : ParamTraitsBase<CommandRawText> {
160 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
161 return CommandRegistry::HardNonTerminal::RawText;
162 }
163};
164template <>
165struct ParamTraits<Json::Value> : ParamTraitsBase<Json::Value> {
166 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
167 return CommandRegistry::HardNonTerminal::JsonObject;
168 }
169};
170template <>
171struct ParamTraits<std::vector<BlockStateCommandParam>> : ParamTraitsBase<std::vector<BlockStateCommandParam>> {
172 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
173 return CommandRegistry::HardNonTerminal::BlockStateArray;
174 }
175};
176template <>
177struct ParamTraits<std::unique_ptr<::Command>> : ParamTraitsBase<std::unique_ptr<::Command>> {
178 static constexpr CommandRegistry::HardNonTerminal parseRuleValue() {
179 return CommandRegistry::HardNonTerminal::SlashCommand;
180 }
181};
182template <class T>
184 bool operator()(
185 CommandRegistry const& registry,
186 void* storage,
187 CommandRegistry::ParseToken const& token,
188 CommandOrigin const&,
189 int,
190 std::string&,
191 std::vector<std::string>&
192 ) const {
193 *(T*)storage = (T)registry.getEnumData(token);
194 return true;
195 }
196};
197template <concepts::Require<std::is_enum> T>
199 using Parser = EnumParser<T>;
200 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::Enum; }
201 static constexpr CommandParameterOption options() { return CommandParameterOption::EnumAutocompleteExpansion; }
202 static constexpr std::string_view enumNameOrPostfix() { return enum_name_v<T>; }
203 static void transformData(CommandParameterData&, CommandRegistrar& registrar) { registrar.template tryRegisterEnum<T>(); }
204};
205template <concepts::Specializes<SoftEnum> T>
206struct ParamTraits<T> : ParamTraitsBase<T> {
207 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::SoftEnum; }
208 static constexpr CommandParameterOption options() { return CommandParameterOption::EnumAutocompleteExpansion; }
209 static inline CommandRegistry::ParseFunction parseFn() { return &CommandRegistry::parse<std::string>; }
210 static constexpr std::string_view enumNameOrPostfix() { return enum_name_v<T>; }
211 static Bedrock::typeid_t<CommandRegistry> typeId() { return Bedrock::type_id<CommandRegistry, std::string>(); }
212 static void transformData(CommandParameterData&, CommandRegistrar& registrar) {
213 registrar.template tryRegisterSoftEnum<T>();
214 }
215};
217 bool operator()(
218 CommandRegistry const&,
219 void*,
221 CommandOrigin const&,
222 int,
223 std::string&,
224 std::vector<std::string>&
225 ) const {
226 return false;
227 }
228};
229template <>
230struct ParamTraits<bool> : ParamTraitsBase<bool> {
231 using Parser = EmptyParser;
232};
233template <>
234struct ParamTraits<DimensionType> : ParamTraitsBase<DimensionType> {
235 using Parser = EmptyParser;
236};
237template <>
239 using Parser = EmptyParser;
240 static constexpr CommandParameterOption options() { return CommandParameterOption::HasSemanticConstraint; }
241};
242template <>
243struct ParamTraits<CommandBlockName> : ParamTraitsBase<CommandBlockName> {
244 using Parser = EmptyParser;
245 static constexpr CommandParameterOption options() { return CommandParameterOption::HasSemanticConstraint; }
246};
247template <>
249 using Parser = EmptyParser;
250};
251template <>
255} // namespace ll::command
256
257template <class T>
258inline bool CommandRegistry::parse(
259 void* storage,
260 CommandRegistry::ParseToken const& token,
261 CommandOrigin const& origin,
262 int version,
263 std::string& error,
264 std::vector<std::string>& errorParams
265) const {
266 using Traits = ll::command::ParamTraits<T>;
267 if constexpr (requires { typename Traits::Parser; }) {
268 return (typename Traits::Parser{})(*this, storage, token, origin, version, error, errorParams);
269 } else {
270 static_assert(ll::traits::always_false<T>, "param traits missing parser type");
271 }
272}
Definition Actor.h:125
Definition typeid_t.h:36
Definition CommandBlockName.h:12
Definition CommandFilePath.h:5
Definition CommandIntegerRange.h:5
Definition CommandItem.h:11
Definition CommandMessage.h:16
Definition CommandOrigin.h:32
Definition CommandParameterData.h:18
Definition CommandPositionFloat.h:8
Definition CommandPosition.h:15
Definition CommandRawText.h:5
Definition CommandRegistry.h:264
Definition CommandRegistry.h:51
Definition CommandSelector.h:15
Definition CommandWildcardInt.h:5
Definition MobEffect.h:26
Definition Player.h:137
Definition RelativeFloat.h:5
Definition WildcardCommandSelector.h:12
Definition CommandRegistrar.h:35
STL namespace.
Definition ActorDefinitionIdentifier.h:15
Definition CommandRegistry.h:471
Definition CommandRegistry.h:398
Definition DimensionType.h:5
Definition ParamTraits.h:216
Definition ParamTraits.h:183
Definition ParamTraits.h:44
Definition ParamTraits.h:67