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(),
53 explicit Overload(CommandHandle& handle, std::weak_ptr<mod::Mod> mod) : OverloadData(handle, std::move(mod)) {}
59 constexpr int indexSearcher(std::string_view s) {
61 for (
auto& member : reflection::member_name_array_v<Params>) {
62 if (member == s)
return i;
65#ifndef __INTELLISENSE__
66 throw std::invalid_argument(
"invalid param " + std::string(str));
74 requires(std::is_constructible_v<std::string_view, S const&>)
75 consteval ParamName(S
const& s) : str(s),
76 idx(indexSearcher(s)) {}
77 constexpr std::string_view get()
const {
return str; }
78 constexpr int index()
const {
return idx; }
82 [[nodiscard]]
constexpr Overload& optional(ParamName
const name) {
83 meta::visitIndex<reflection::member_count_v<Params>>(name.index(), [&]<
size_t I>() {
84 addParam<I, true>(name.get());
88 [[nodiscard]]
constexpr Overload& required(ParamName
const name) {
89 meta::visitIndex<reflection::member_count_v<Params>>(name.index(), [&]<
size_t I>() {
90 addParam<I, false>(name.get());
94 [[nodiscard]]
constexpr Overload& text(std::string_view text) {
95 addTextImpl(text, (
int)placeholderOffset);
99 [[nodiscard]]
constexpr Overload& modify(Fn&& fn) {
100 std::invoke(std::forward<Fn>(fn), back());
104 [[nodiscard]]
constexpr Overload& postfix(std::string_view postfix) {
105 return modify([&](
auto&& val) {
106 val.mEnumNameOrPostfix = storeStr(postfix);
107 val.mParamType = CommandParameterDataType::Postfix;
110 [[nodiscard]]
constexpr Overload& option(CommandParameterOption option) {
111 return modify([&](
auto&& val) { val.addOptions(option); });
113 [[nodiscard]]
constexpr Overload& deoption(CommandParameterOption option) {
114 return modify([&](
auto&& val) {
115 val.mOptions = (CommandParameterOption)((uchar)(val.mOptions) & (!(uchar)option));
121 void constexpr execute(Fn&& fn) {
122 using E = std::remove_cvref_t<Fn>;
123 setFactory([fn = std::forward<Fn>(fn)]() -> std::unique_ptr<::Command> {