LeviLamina
Loading...
Searching...
No Matches
ParamTraits.h
1#pragma once
2
3#include <cstddef>
4#include <stdexcept>
5#include <string>
6#include <string_view>
7#include <type_traits>
8
9#include "ll/api/base/StdInt.h"
10#include "ll/api/command/CommandRegistrar.h"
11#include "ll/api/command/EnumName.h"
12#include "ll/api/command/Optional.h"
13#include "ll/api/command/SoftEnum.h"
14
15#include "mc/deps/core/utility/typeid_t.h"
16#include "mc/server/commands/CommandParameterData.h"
17#include "mc/server/commands/CommandParameterDataType.h"
18#include "mc/server/commands/CommandParameterOption.h"
19#include "mc/server/commands/CommandRegistry.h"
20
21namespace ll::command {
22template <class T>
24 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::Basic; }
25 static constexpr CommandParameterOption options() { return CommandParameterOption::None; }
26 static inline CommandRegistry::ParseFunction parseFn() { return &CommandRegistry::parse<T>; }
27 static constexpr std::string_view enumNameOrPostfix() { return {}; }
28 static constexpr std::string_view subChain() { return {}; }
29 static Bedrock::typeid_t<CommandRegistry> typeId() { return Bedrock::type_id<CommandRegistry, T>(); }
30 static constexpr void transformData(CommandParameterData&) {}
31};
32template <class T>
34template <class T>
35struct EnumParser {
36 bool operator()(
37 CommandRegistry const& registry,
38 void* storage,
39 CommandRegistry::ParseToken const& token,
40 CommandOrigin const&,
41 int,
42 std::string&,
43 std::vector<std::string>&
44 ) const {
45 *(T*)storage = (T)registry.getEnumData(token);
46 return true;
47 }
48};
49template <concepts::Require<std::is_enum> T>
50struct ParamTraits<T> : ParamTraitsBase<T> {
51 using Parser = EnumParser<T>;
52 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::Enum; }
53 static constexpr CommandParameterOption options() { return CommandParameterOption::EnumAutocompleteExpansion; }
54 static constexpr std::string_view enumNameOrPostfix() { return enum_name_v<T>; }
55 static void transformData(CommandParameterData&) { CommandRegistrar::getInstance().template tryRegisterEnum<T>(); }
56};
57template <concepts::Specializes<SoftEnum> T>
59 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::SoftEnum; }
60 static constexpr CommandParameterOption options() { return CommandParameterOption::EnumAutocompleteExpansion; }
61 static inline CommandRegistry::ParseFunction parseFn() { return &CommandRegistry::parse<std::string>; }
62 static constexpr std::string_view enumNameOrPostfix() { return enum_name_v<T>; }
63 static Bedrock::typeid_t<CommandRegistry> typeId() { return Bedrock::type_id<CommandRegistry, std::string>(); }
64 static void transformData(CommandParameterData&) {
65 CommandRegistrar::getInstance().template tryRegisterSoftEnum<T>();
66 }
67};
69 bool operator()(
70 CommandRegistry const&,
71 void*,
73 CommandOrigin const&,
74 int,
75 std::string&,
76 std::vector<std::string>&
77 ) const {
78 return false;
79 }
80};
81template <>
82struct ParamTraits<bool> : ParamTraitsBase<bool> {
83 using Parser = EmptyParser;
84};
85template <>
86struct ParamTraits<DimensionType> : ParamTraitsBase<DimensionType> {
87 using Parser = EmptyParser;
88};
89template <>
90struct ParamTraits<CommandItem> : ParamTraitsBase<CommandItem> {
91 using Parser = EmptyParser;
92 static constexpr CommandParameterOption options() { return CommandParameterOption::HasSemanticConstraint; }
93};
94template <>
95struct ParamTraits<CommandBlockName> : ParamTraitsBase<CommandBlockName> {
96 using Parser = EmptyParser;
97 static constexpr CommandParameterOption options() { return CommandParameterOption::HasSemanticConstraint; }
98};
99template <>
103template <>
107} // namespace ll::command
108
109template <class T>
110inline bool CommandRegistry::parse(
111 void* storage,
112 CommandRegistry::ParseToken const& token,
113 CommandOrigin const& origin,
114 int version,
115 std::string& error,
116 std::vector<std::string>& errorParams
117) const {
118 using Traits = ll::command::ParamTraits<T>;
119 if constexpr (requires { typename Traits::Parser; }) {
120 return (typename Traits::Parser{})(*this, storage, token, origin, version, error, errorParams);
121 } else {
122 static_assert(ll::traits::always_false<T>, "param traits missing parser type");
123 }
124}
Definition AutomaticID.h:6
Definition typeid_t.h:25
Definition CommandBlockName.h:12
Definition CommandItem.h:11
Definition CommandOrigin.h:32
Definition CommandParameterData.h:18
Definition CommandRegistry.h:44
Definition MobEffect.h:27
Definition Parser.h:28
Definition ActorDefinitionIdentifier.h:15
Definition CommandRegistry.h:334
Definition ParamTraits.h:68
Definition ParamTraits.h:35
Definition ParamTraits.h:23
Definition ParamTraits.h:33