16class Overload :
private OverloadData {
23 static constexpr auto paramOffset = offsetof(Overload<Params>::TestOffset, params);
24 static constexpr auto placeholderOffset = offsetof(Overload<Params>::TestOffset, placeholder);
26 template <
size_t I,
bool Opt>
27 constexpr void addParam(std::string_view name) {
28 using OriginalType = std::remove_cvref_t<typename reflection::member_t<I, Params>>;
29 using RemoveOptionalType = remove_optional_t<OriginalType>;
30 int offset = (int)(paramOffset + reflection::member_offset_v<I, Params>);
32 if constexpr (traits::is_specialization_of_v<OriginalType, Optional>) {
33 flagOffset = offset + OptionalOffsetGetter<RemoveOptionalType>::value;
36 Traits::transformData(
42 Traits::enumNameOrPostfix(),
52 explicit Overload(CommandHandle& handle, std::weak_ptr<mod::Mod> mod) : OverloadData(handle, std::move(mod)) {}
58 constexpr int indexSearcher(std::string_view s) {
60 for (
auto& member : reflection::member_name_array_v<Params>) {
61 if (member == s)
return i;
64#ifndef __INTELLISENSE__
65 throw std::invalid_argument(
"invalid param " + std::string(str));
73 requires(std::is_constructible_v<std::string_view, S const&>)
74 consteval ParamName(S
const& s) : str(s),
75 idx(indexSearcher(s)) {}
76 constexpr std::string_view get()
const {
return str; }
77 constexpr int index()
const {
return idx; }
81 [[nodiscard]]
constexpr Overload& optional(ParamName
const name) {
82 meta::visitIndex<reflection::member_count_v<Params>>(name.index(), [&]<
size_t I>() {
83 addParam<I, true>(name.get());
87 [[nodiscard]]
constexpr Overload& required(ParamName
const name) {
88 meta::visitIndex<reflection::member_count_v<Params>>(name.index(), [&]<
size_t I>() {
89 addParam<I, false>(name.get());
93 [[nodiscard]]
constexpr Overload& text(std::string_view text) {
94 addTextImpl(text, (
int)placeholderOffset);
98 [[nodiscard]]
constexpr Overload& modify(Fn&& fn) {
99 std::invoke(std::forward<Fn>(fn), back());
103 [[nodiscard]]
constexpr Overload& postfix(std::string_view postfix) {
104 return modify([&](
auto&& val) {
105 val.mEnumNameOrPostfix = storeStr(postfix);
106 val.mParamType = CommandParameterDataType::Postfix;
109 [[nodiscard]]
constexpr Overload& option(CommandParameterOption option) {
110 return modify([&](
auto&& val) { val.addOptions(option); });
112 [[nodiscard]]
constexpr Overload& deoption(CommandParameterOption option) {
113 return modify([&](
auto&& val) {
114 val.mOptions = (CommandParameterOption)((uchar)(val.mOptions) & (!(uchar)option));
120 void constexpr execute(Fn&& fn) {
121 using E = std::remove_cvref_t<Fn>;
122 setFactory([fn = std::forward<Fn>(fn)]() -> std::unique_ptr<::Command> {