Iros
 
Loading...
Searching...
No Matches
option.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/meta/language.h"
8#include "di/parser/prelude.h"
10#include "di/vocab/prelude.h"
11
12namespace di::cli::detail {
13class Option {
14private:
15 using Parse = Result<> (*)(void*, Optional<TransparentStringView>);
16
17 template<auto member>
18 constexpr static auto concrete_parse(void* output_untyped, Optional<TransparentStringView> input) -> Result<> {
19 using Base = meta::MemberPointerClass<decltype(member)>;
20 using Value = meta::MemberPointerValue<decltype(member)>;
21
22 auto output = static_cast<Base*>(output_untyped);
23 if constexpr (concepts::SameAs<Value, bool>) {
24 DI_ASSERT(!input);
25 (*output).*member = true;
26 return {};
27 } else {
28 DI_ASSERT(input);
29 if constexpr (concepts::Optional<Value>) {
30 (*output).*member = DI_TRY(parser::parse<meta::OptionalValue<Value>>(*input));
31 } else {
32 (*output).*member = DI_TRY(parser::parse<Value>(*input));
33 }
34 return {};
35 }
36 }
37
38public:
39 Option() = default;
40
41 template<auto member>
44 bool required = false, bool always_succeeds = false)
45 : m_parse(concrete_parse<member>)
46 , m_short_name(short_name)
47 , m_long_name(long_name)
48 , m_description(description)
49 , m_required(required)
50 , m_always_succeeds(always_succeeds)
51 , m_boolean(di::SameAs<meta::MemberPointerValue<decltype(member)>, bool>) {}
52
53 constexpr auto parse(void* base, Optional<TransparentStringView> input) const {
54 DI_ASSERT(m_parse);
55 return m_parse(base, input);
56 }
57 constexpr auto short_name() const { return m_short_name; }
58 constexpr auto long_name() const { return m_long_name; }
59 constexpr auto description() const { return m_description; }
60 constexpr auto required() const { return m_required; }
61 constexpr auto boolean() const { return m_boolean; }
62 constexpr auto always_succeeds() const { return m_always_succeeds; }
63
64 constexpr auto long_display_name() const {
65 auto result = di::TransparentString {};
66 result += di::single('-');
67 result += di::single('-');
68 result += m_long_name.value();
69 return result;
70 }
71
72 constexpr auto short_display_name() const {
73 auto result = di::TransparentString {};
74 result += di::single('-');
75 result += di::single(m_short_name.value());
76 return result;
77 }
78
79 constexpr auto display_name() const {
80 if (long_name()) {
81 return long_display_name();
82 }
83 if (short_name()) {
84 return short_display_name();
85 }
86 return di::TransparentString {};
87 }
88
89private:
90 Parse m_parse { nullptr };
91 Optional<char> m_short_name;
93 StringView m_description;
94 bool m_required { false };
95 bool m_always_succeeds { false };
96 bool m_boolean { false };
97};
98}
#define DI_ASSERT(...)
Definition assert_bool.h:7
constexpr auto long_name() const
Definition option.h:58
constexpr auto short_name() const
Definition option.h:57
constexpr auto description() const
Definition option.h:59
constexpr auto short_display_name() const
Definition option.h:72
constexpr auto boolean() const
Definition option.h:61
constexpr auto required() const
Definition option.h:60
constexpr auto display_name() const
Definition option.h:79
constexpr auto parse(void *base, Optional< TransparentStringView > input) const
Definition option.h:53
constexpr Option(Constexpr< member >, Optional< char > short_name={}, Optional< TransparentStringView > long_name={}, StringView description={}, bool required=false, bool always_succeeds=false)
Definition option.h:42
constexpr auto long_display_name() const
Definition option.h:64
constexpr auto always_succeeds() const
Definition option.h:62
Definition optional_forward_declaration.h:5
Definition vocab.h:77
Definition core.h:114
#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::TransparentEncoding > TransparentString
Definition string.h:12
Definition merge_interfaces.h:6
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
constexpr auto parse
Definition parse.h:23
Expected< T, Error > Result
Definition result.h:8
Definition zstring_parser.h:9
A wrapper for a constexpr value.
Definition core.h:77