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>) {
36 Traits::transformData(addParamImpl(
41 Traits::enumNameOrPostfix(),
55 constexpr int indexSearcher(std::string_view s) {
57 for (
auto& member : reflection::member_name_array_v<Params>) {
58 if (member == s)
return i;
61#ifndef __INTELLISENSE__
62 throw std::invalid_argument(
"invalid param " + std::string(str));
70 requires(std::is_constructible_v<std::string_view, S const&>)
71 consteval ParamName(S
const& s) : str(s),
72 idx(indexSearcher(s)) {}
73 constexpr std::string_view get()
const {
return str; }
74 constexpr int index()
const {
return idx; }
78 [[nodiscard]]
constexpr Overload& optional(ParamName
const name) {
79 meta::visitIndex<reflection::member_count_v<Params>>(name.index(), [&]<
size_t I>() {
80 addParam<I, true>(name.get());
84 [[nodiscard]]
constexpr Overload& required(ParamName
const name) {
85 meta::visitIndex<reflection::member_count_v<Params>>(name.index(), [&]<
size_t I>() {
86 addParam<I, false>(name.get());
90 [[nodiscard]]
constexpr Overload& text(std::string_view text) {
91 addTextImpl(text, (
int)placeholderOffset);
95 [[nodiscard]]
constexpr Overload& modify(Fn&& fn) {
96 std::invoke(std::forward<Fn>(fn), back());
100 [[nodiscard]]
constexpr Overload& postfix(std::string_view postfix) {
101 return modify([&](
auto&& val) {
102 val.mEnumNameOrPostfix = storeStr(postfix);
103 val.mParamType = CommandParameterDataType::Postfix;
106 [[nodiscard]]
constexpr Overload& option(CommandParameterOption option) {
107 return modify([&](
auto&& val) { val.addOptions(option); });
109 [[nodiscard]]
constexpr Overload& deoption(CommandParameterOption option) {
110 return modify([&](
auto&& val) {
111 val.mOptions = (CommandParameterOption)((uchar)(val.mOptions) & (!(uchar)option));
117 void constexpr execute(Fn&& fn) {
118 using E = std::remove_cvref_t<Fn>;
119 setFactory([fn = std::forward<Fn>(fn)]() -> std::unique_ptr<::Command> {