LeviLamina
Loading...
Searching...
No Matches
Command.h
1#pragma once
2
3#include <memory>
4
5#include "ll/api/base/StdInt.h"
6#include "ll/api/reflection/Reflection.h" // IWYU pragma: keep
7
8#include "mc/server/commands/Command.h"
9
10namespace ll::command {
11
12namespace detail {
13LLAPI void printCommandError(::Command const&, ::CommandOutput&) noexcept;
14}
15
16struct EmptyParam {};
17
18template <reflection::Reflectable P, class E>
19 requires(std::default_initializable<P>)
20class Command : public ::Command {
21 uint64 placeholder{};
22 P parameters;
23 E const& executor;
24
25 Command() = default;
26
27public:
28 Command(E const& executor) : executor(executor) {}
29
30 virtual ~Command() = default;
31
32 void execute(class CommandOrigin const& origin, class CommandOutput& output) const override {
33 try {
34 if constexpr (std::is_invocable_v<E, CommandOrigin const&, CommandOutput&, P const&, ::Command const&>) {
35 executor(origin, output, parameters, *this);
36 } else if constexpr (std::is_invocable_v<E, CommandOrigin const&, CommandOutput&, P const&>) {
37 executor(origin, output, parameters);
38 } else if constexpr (std::is_invocable_v<E, CommandOrigin const&, CommandOutput&>) {
39 executor(origin, output);
40 } else {
41 executor();
42 }
43 } catch (...) {
44 ::ll::command::detail::printCommandError(*this, output);
45 }
46 }
47};
48} // namespace ll::command
Definition CommandOrigin.h:32
Definition CommandOutput.h:19
Definition Command.h:17
Definition Command.h:20
Definition Command.h:16