19namespace di::cli::detail {
22 using Parse =
Result<> (*)(
void*, Optional<TransparentStringView>);
23 using GetValues = Vector<Tuple<String, StringView>> (*)();
24 using DefaultValue =
String (*)();
27 constexpr static auto concrete_parse(
void* output_untyped, Optional<TransparentStringView> input) ->
Result<> {
31 auto output =
static_cast<Base*
>(output_untyped);
32 if constexpr (concepts::SameAs<Value, bool>) {
34 (*output).*member =
true;
41 if constexpr (concepts::Optional<Value>) {
54 constexpr explicit Option(Constexpr<member>, Optional<char> short_name = {},
55 Optional<TransparentStringView> long_name = {},
StringView description = {},
56 bool required =
false, Optional<StringView> value_name = {},
57 Optional<ValueType> value_type = {},
bool is_help =
false)
58 : m_parse(concrete_parse<member>)
59 , m_get_values(detail::concrete_get_values<meta::
MemberPointerValue<decltype(member)>>)
60 , m_default_value(detail::concrete_default_value<member>)
61 , m_short_name(short_name)
62 , m_long_name(long_name)
63 , m_description(description)
64 , m_value_name(value_name)
66 , m_required(required)
70 constexpr auto parse(
void* base, Optional<TransparentStringView> input)
const {
72 return m_parse(base, input);
74 constexpr auto short_name()
const {
return m_short_name; }
75 constexpr auto long_name()
const {
return m_long_name; }
76 constexpr auto description()
const {
return m_description; }
77 constexpr auto required()
const {
return m_required; }
78 constexpr auto boolean()
const {
return m_boolean; }
79 constexpr auto is_help()
const {
return m_is_help; }
81 constexpr auto long_display_name()
const {
83 result += di::single(
'-');
84 result += di::single(
'-');
85 result += m_long_name.value();
89 constexpr auto short_display_name()
const {
91 result += di::single(
'-');
92 result += di::single(m_short_name.value());
96 constexpr auto display_name()
const {
98 return long_display_name();
101 return short_display_name();
106 constexpr auto value_name() const ->
String {
108 return m_value_name.value().to_owned();
114 for (
auto c : m_long_name.value()) {
116 result.push_back(U
'_');
117 }
else if (c >=
'a' && c <=
'z') {
118 result.push_back(c & ~0x20);
126 constexpr auto default_value() const ->
String {
return m_default_value(); }
127 constexpr auto value_type() const ->
ValueType {
return m_value_type; }
128 constexpr auto values() const -> Vector<Tuple<
String,
StringView>> {
return m_get_values(); }
130 constexpr auto zsh_completion_specs() const -> Vector<
String> {
131 auto prefixes = Vector<TransparentString> {};
133 prefixes.push_back(short_display_name());
136 prefixes.push_back(long_display_name());
140 auto value_char = boolean() ?
""_sv : prefix.starts_with(
"--"_tsv) ?
"="_sv :
"+"_sv;
141 auto value_spec =
""_s;
143 auto values = this->values();
154 Parse m_parse {
nullptr };
155 GetValues m_get_values {
nullptr };
156 DefaultValue m_default_value {
nullptr };
157 Optional<char> m_short_name;
158 Optional<TransparentStringView> m_long_name;
160 Optional<StringView> m_value_name;
162 bool m_required {
false };
163 bool m_is_help {
false };
164 bool m_boolean {
false };
#define DI_ASSERT(...)
Definition assert_bool.h:7
#define DI_TRY(...)
Definition monad_try.h:13
constexpr auto escape_description(StringView input) -> String
Definition zsh.h:19
constexpr auto value_completions(ValueType value_type, Span< Tuple< String, StringView > > values) -> String
Definition zsh.h:140
ValueType
Definition value_type.h:11
@ Unknown
Definition value_type.h:12
constexpr auto default_value_type
Definition value_type.h:82
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
string::StringImpl< string::TransparentEncoding > TransparentString
Definition string.h:12
string::StringImpl< string::Utf8Encoding > String
Definition string.h:11
constexpr auto transform
Definition transform.h:59
constexpr auto parse
Definition parse.h:23
Expected< T, Error > Result
Definition result.h:8
constexpr auto format
Definition format.h:7
constexpr auto to(Con &&container, Args &&... args)
Definition to.h:25
constexpr auto parse
Definition parse.h:23