21#ifndef LIB_DETAIL_ARGUMENTPARSER_HPP_
22#define LIB_DETAIL_ARGUMENTPARSER_HPP_
39template <std::
size_t Length>
46 std::copy(name, name + Length - 1,
name_.begin());
53 return std::string_view{
name_.begin(),
name_.size()};
56 std::array<char, Length - 1>
name_;
70enum struct NArgs : std::uint8_t {
76template <ComptimeString PrimaryName, ComptimeString... Aliases>
78 static_assert(PrimaryName.PrintableView().starts_with(
"-"),
79 "Primary Argument name must start with a -");
81 static inline constexpr std::array<std::string_view,
sizeof...(Aliases) + 1>
82 names_{PrimaryName.PrintableView(), Aliases.PrintableView()...};
85 PrimaryName.PrintableView()};
93 static inline constexpr std::array<std::string_view, 0>
names_{};
101template <
class ParseType,
NArgs N,
auto Converter, ComptimeString... Names>
102 requires std::regular_invocable<
decltype(Converter), std::string_view>
104 static_assert(
false,
"Use a specialized version of this struct");
110 requires std::regular_invocable<
decltype(Converter), std::string_view>
112 static_assert(!std::is_same_v<void, T>,
113 "Flag arguments cannot be of type void");
122 value.emplace_back(std::invoke(Converter, arg));
127 bool is_this{std::ranges::any_of(
129 [arg](std::string_view name) {
return name == arg; })};
139 throw std::runtime_error{
140 std::format(
"ERROR! Duplicate option: {}", arg)};
141 }
else if (!
value.size()) {
142 throw std::runtime_error{std::format(
143 "ERROR! Do not specify {} and supply no arguments",
151 throw std::runtime_error{
152 std::format(
"ERROR! Duplicate option: {}", arg)};
162template <
class T, auto Converter>
163 requires std::regular_invocable<
decltype(Converter), std::string_view>
165 static_assert(!std::is_same_v<void, T>,
166 "Positional arguments cannot be of type void");
174 value.emplace_back(std::invoke(Converter, arg));
188template <
class T,
auto Converter, ComptimeString... Names>
190 static_assert(std::is_same_v<void, T>,
191 "A flag returning no values cannot have a non-void type");
195 bool is_this{std::ranges::any_of(
197 [arg](std::string_view name) {
return name == arg; })};
207 throw std::runtime_error{
208 std::format(
"ERROR! Duplicate option: {}", arg)};
217template <
class T,
auto Converter, ComptimeString... Names>
218 requires std::regular_invocable<
decltype(Converter), std::string_view>
220 static_assert(!std::is_same_v<void, T>,
221 "Flag argument cannot be of type void");
229 value = std::invoke(Converter, arg);
235 bool is_this{std::ranges::any_of(
237 [arg](std::string_view name) {
return name == arg; })};
248 throw std::runtime_error{std::format(
249 "ERROR: unexpected repeated flag: {}", arg)};
Definition ArgumentParser.hpp:37
NArgs
Definition ArgumentParser.hpp:70
@ One
Definition ArgumentParser.hpp:72
@ Many
Definition ArgumentParser.hpp:73
@ None
Definition ArgumentParser.hpp:71
ParseState
Definition ArgumentParser.hpp:64
@ End
Definition ArgumentParser.hpp:67
@ Start
Definition ArgumentParser.hpp:65
@ Seeking
Definition ArgumentParser.hpp:66
static constexpr std::string_view help_view_
Definition ArgumentParser.hpp:95
static constexpr std::array< std::string_view, 0 > names_
Definition ArgumentParser.hpp:93
ParseState state_
Definition ArgumentParser.hpp:98
Definition ArgumentParser.hpp:77
static constexpr std::array< std::string_view, sizeof...(Aliases)+1 > names_
Definition ArgumentParser.hpp:82
static constexpr std::string_view help_view_
Definition ArgumentParser.hpp:84
ParseState state_
Definition ArgumentParser.hpp:88
std::vector< T > value
Definition ArgumentParser.hpp:159
constexpr void TryParseValue(std::string_view arg)
Definition ArgumentParser.hpp:115
constexpr void TryParseFlag(std::string_view arg)
Definition ArgumentParser.hpp:126
constexpr void TryParseValue(std::string_view arg)
Definition ArgumentParser.hpp:168
std::vector< T > value
Definition ArgumentParser.hpp:185
constexpr void TryParseFlag(std::string_view _)
Definition ArgumentParser.hpp:180
bool value
Definition ArgumentParser.hpp:214
constexpr void TryParseFlag(std::string_view arg)
Definition ArgumentParser.hpp:194
constexpr void TryParseValue(std::string_view _)
Definition ArgumentParser.hpp:193
constexpr void TryParseFlag(std::string_view arg)
Definition ArgumentParser.hpp:234
T value
Definition ArgumentParser.hpp:255
constexpr void TryParseValue(std::string_view arg)
Definition ArgumentParser.hpp:223
Definition ArgumentParser.hpp:103
Definition ArgumentParser.hpp:40
constexpr bool operator==(const ComptimeString &) const =default
std::array< char, Length - 1 > name_
Definition ArgumentParser.hpp:56
consteval ComptimeString(const char(&name)[Length])
Definition ArgumentParser.hpp:44
constexpr auto operator<=>(const ComptimeString &) const =default
consteval std::string_view PrintableView() const
Definition ArgumentParser.hpp:52