LeviLamina
Loading...
Searching...
No Matches
ParamKind.h
1#pragma once
2
3#include "ll/api/base/Meta.h"
4#include "ll/api/command/Optional.h"
5#include "ll/api/command/ParamTraits.h"
6#include "ll/api/command/runtime/RuntimeEnum.h"
7
8namespace ll::command {
9
10using ParamKindType = size_t;
11
12namespace ParamKind {
13
14enum Kind : ParamKindType {
15 Int,
16 Bool,
17 Float,
18 Dimension,
19 String,
20 Enum,
21 SoftEnum,
22 Actor,
23 Player,
24 BlockPos,
25 Vec3,
26 RawText,
27 Message,
28 JsonValue,
29 Item,
30 BlockName,
31 BlockState,
32 Effect,
33 ActorType,
34 Command,
35 RelativeFloat,
36 IntegerRange,
37 FilePath,
38 WildcardInt,
39 WildcardActor,
40 // New types can only be added here, to keep the ABI stable.
41 Count,
42};
43} // namespace ParamKind
44
45using ParamKindList = meta::TypeList<
46 int,
47 bool,
48 float,
49 ::DimensionType,
50 std::string,
53 CommandSelector<Actor>,
54 CommandSelector<Player>,
55 CommandPosition,
56 CommandPositionFloat,
57 CommandRawText,
58 CommandMessage,
59 Json::Value,
60 CommandItem,
61 CommandBlockName,
62 std::vector<BlockStateCommandParam>,
63 MobEffect const*,
64 ActorDefinitionIdentifier const*,
65 std::unique_ptr<::Command>,
66 RelativeFloat,
67 CommandIntegerRange,
68 CommandFilePath,
69 CommandWildcardInt,
70 WildcardCommandSelector<Actor>
71 // New types can only be added here, to keep the ABI stable.
72 >;
73
74class ParamStorageType : public Optional<ParamKindList::to<std::variant>> {
75public:
76 using Optional<ParamKindList::to<std::variant>>::Optional;
77
78 ParamKindType index() const { return mValue.index(); }
79 bool hold(ParamKindType kind) const { return has_value() && kind == index(); }
80 template <size_t N>
81 decltype(auto) get() const {
82 return std::get<N>(value());
83 }
84};
85
86} // namespace ll::command
Definition ParamKind.h:74
Definition RuntimeEnum.h:9
Definition RuntimeEnum.h:13