Iros
 
Loading...
Searching...
No Matches
argument.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/parser/prelude.h"
10
11namespace di::cli::detail {
12class Argument {
13private:
14 using Parse = Result<> (*)(void*, Span<TransparentStringView>);
15
16 template<auto member>
17 constexpr static auto concrete_variadic() -> bool {
18 using Value = meta::MemberPointerValue<decltype(member)>;
19
20 // Match any form of vector, but not a string-like type.
22 }
23
24 template<auto member>
25 constexpr static auto concrete_parse(void* output_untyped, Span<TransparentStringView> input) -> Result<> {
26 using Base = meta::MemberPointerClass<decltype(member)>;
27 using Value = meta::MemberPointerValue<decltype(member)>;
28
29 auto* output = static_cast<Base*>(output_untyped);
30 if constexpr (concrete_variadic<member>()) {
31 auto& vector = (*output).*member = Value();
32 for (auto view : input) {
34 DI_TRY(vector.emplace_back(DI_TRY(parser::parse<meta::ContainerValue<Value>>(view))));
35 } else {
36 vector.emplace_back(DI_TRY(parser::parse<meta::ContainerValue<Value>>(view)));
37 }
38 }
39 return {};
40 } else {
41 DI_ASSERT(input.size() == 1);
42 if constexpr (concepts::Optional<Value>) {
43 (*output).*member = DI_TRY(parser::parse<meta::OptionalValue<Value>>(input[0]));
44 } else {
45 (*output).*member = DI_TRY(parser::parse<Value>(input[0]));
46 }
47 return {};
48 }
49 }
50
51public:
52 Argument() = default;
53
54 template<auto member>
56 bool required = false)
57 : m_parse(concrete_parse<member>)
58 , m_argument_name(argument_name)
59 , m_description(description)
60 , m_required(required)
61 , m_variadic(concrete_variadic<member>()) {
62 static_assert(concepts::MemberObjectPointer<decltype(member)>,
63 "Argument member must be a pointer to a member object.");
64 }
65
66 constexpr auto parse(void* output, Span<TransparentStringView> input) const {
67 DI_ASSERT(m_parse);
68 return m_parse(output, input);
69 }
70 constexpr auto argument_name() const { return m_argument_name; }
71 constexpr auto description() const { return m_description; }
72 constexpr auto required() const { return m_required; }
73 constexpr auto variadic() const { return m_variadic; }
74
75 constexpr auto required_argument_count() const -> usize { return required() ? 1 : 0; }
76
77 constexpr auto display_name() const {
78 auto result = di::String {};
79 if (!required()) {
80 result.push_back(U'[');
81 }
82 result += m_argument_name;
83 if (variadic()) {
84 result.push_back(U'.');
85 result.push_back(U'.');
86 result.push_back(U'.');
87 }
88 if (!required()) {
89 result.push_back(U']');
90 }
91 return result;
92 }
93
94private:
95 Parse m_parse { nullptr };
96 StringView m_argument_name;
97 StringView m_description;
98 bool m_required { false };
99 bool m_variadic { false };
100};
101}
#define DI_ASSERT(...)
Definition assert_bool.h:7
constexpr Argument(Constexpr< member >, StringView argument_name={}, StringView description={}, bool required=false)
Definition argument.h:55
constexpr auto required() const
Definition argument.h:72
constexpr auto variadic() const
Definition argument.h:73
constexpr auto description() const
Definition argument.h:71
constexpr auto parse(void *output, Span< TransparentStringView > input) const
Definition argument.h:66
constexpr auto argument_name() const
Definition argument.h:70
constexpr auto display_name() const
Definition argument.h:77
constexpr auto required_argument_count() const -> usize
Definition argument.h:75
Definition span_forward_declaration.h:10
Definition vocab.h:30
Definition encoding.h:225
Definition language.h:203
Definition vocab.h:77
Definition mutable_vector.h:13
#define DI_TRY(...)
Definition monad_try.h:13
Definition argument.h:11
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
string::StringImpl< string::Utf8Encoding > String
Definition string.h:11
Type< detail::MemberPointerValueHelper< RemoveCV< T > > > MemberPointerValue
Definition language.h:184
meta::RemoveCVRef< T >::Value OptionalValue
Definition vocab.h:82
Type< detail::MemberPointerClassHelper< RemoveCV< T > > > MemberPointerClass
Definition language.h:195
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
constexpr auto parse
Definition parse.h:23
size_t usize
Definition integers.h:33
Expected< T, Error > Result
Definition result.h:8
A wrapper for a constexpr value.
Definition core.h:77