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
37 operator()(CommandRegistry const& registry, void* storage, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&, std::vector<std::string>&)
38 const {
39 *(T*)storage = (T)registry.getEnumData(token);
40 return true;
41 }
42};
43template <concepts::Require<std::is_enum> T>
44struct ParamTraits<T> : ParamTraitsBase<T> {
45 using Parser = EnumParser<T>;
46 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::Enum; }
47 static constexpr CommandParameterOption options() { return CommandParameterOption::EnumAutocompleteExpansion; }
48 static constexpr std::string_view enumNameOrPostfix() { return enum_name_v<T>; }
49 static void transformData(CommandParameterData&) { CommandRegistrar::getInstance().template tryRegisterEnum<T>(); }
50};
51template <concepts::Specializes<SoftEnum> T>
53 static constexpr CommandParameterDataType dataType() { return CommandParameterDataType::SoftEnum; }
54 static constexpr CommandParameterOption options() { return CommandParameterOption::EnumAutocompleteExpansion; }
55 static inline CommandRegistry::ParseFunction parseFn() { return &CommandRegistry::parse<std::string>; }
56 static constexpr std::string_view enumNameOrPostfix() { return enum_name_v<T>; }
57 static Bedrock::typeid_t<CommandRegistry> typeId() { return Bedrock::type_id<CommandRegistry, std::string>(); }
58 static void transformData(CommandParameterData&) {
59 CommandRegistrar::getInstance().template tryRegisterSoftEnum<T>();
60 }
61};
63 bool
64 operator()(CommandRegistry const&, void*, CommandRegistry::ParseToken const&, CommandOrigin const&, int, std::string&, std::vector<std::string>&)
65 const {
66 return false;
67 }
68};
69template <>
70struct ParamTraits<bool> : ParamTraitsBase<bool> {
71 using Parser = EmptyParser;
72};
73template <>
74struct ParamTraits<DimensionType> : ParamTraitsBase<DimensionType> {
75 using Parser = EmptyParser;
76};
77template <>
78struct ParamTraits<CommandItem> : ParamTraitsBase<CommandItem> {
79 using Parser = EmptyParser;
80 static constexpr CommandParameterOption options() { return CommandParameterOption::HasSemanticConstraint; }
81};
82template <>
83struct ParamTraits<CommandBlockName> : ParamTraitsBase<CommandBlockName> {
84 using Parser = EmptyParser;
85 static constexpr CommandParameterOption options() { return CommandParameterOption::HasSemanticConstraint; }
86};
87template <>
91template <>
95} // namespace ll::command
96
97template <class T>
98inline bool CommandRegistry::parse(
99 void* storage,
100 CommandRegistry::ParseToken const& token,
101 CommandOrigin const& origin,
102 int version,
103 std::string& error,
104 std::vector<std::string>& errorParams
105) const {
106 using Traits = ll::command::ParamTraits<T>;
107 if constexpr (requires { typename Traits::Parser; }) {
108 return (typename Traits::Parser{})(*this, storage, token, origin, version, error, errorParams);
109 } else {
110 static_assert(ll::traits::always_false<T>, "param traits missing parser type");
111 }
112}
Definition AutomaticID.h:6
Definition typeid_t.h:25
Definition CommandBlockName.h:12
Definition CommandItem.h:11
Definition CommandOrigin.h:32
Definition CommandParameterData.h:17
Definition CommandRegistry.h:44
Definition MobEffect.h:27
Definition Parser.h:29
Definition ActorDefinitionIdentifier.h:13
Definition CommandRegistry.h:373
Definition ParamTraits.h:62
Definition ParamTraits.h:35
Definition ParamTraits.h:23
Definition ParamTraits.h:33