21#ifndef LIB_ARGUMENTPARSER_HPP_
22#define LIB_ARGUMENTPARSER_HPP_
42template <
class T, auto Converter>
48 [](std::string_view) {}, Names...>;
50template <
class T,
auto Converter, detail::ComptimeString... Names>
56 static inline constexpr std::array<std::string_view,
sizeof...(Names)>
57 names{Names.PrintableView()...};
62template <
class ConvertedType, auto Converter>
64 std::regular_invocable<
decltype(Converter), std::string_view> &&
65 std::same_as<ConvertedType,
66 std::invoke_result_t<
decltype(Converter), std::string_view>>;
68template <
class ConvertedType, auto Converter>
70 std::same_as<
decltype(Converter), nullptr_t>;
72template <
class ConvertedType>
73concept NonVoid = !std::same_as<ConvertedType, void>;
75template <
class ConvertedType, auto Converter>
80template <
class ConvertedType, auto Converter>
83 using type = ConvertedType;
84 static inline constexpr decltype(Converter)
Fn{Converter};
87template <detail::ComptimeString Program, detail::ComptimeString Version,
88 detail::ComptimeString Usage, detail::ComptimeString Summary>
96template <
class T,
template <
class, auto>
class U>
99template <
class V, auto C,
template <
class, auto>
class U>
106template <
class T,
template <detail::ComptimeString...>
class U>
124 std::same_as<std::remove_cv_t<
decltype(T::Fn)>, nullptr_t>;
130template <IsArgumentInfo Info_t, IsFlagConverter Converter_t>
133template <IsArgumentInfo Info_t, IsValueConverter Converter_t>
137concept Arg =
requires(T arg) {
138 std::same_as<std::string_view,
decltype(T::help_view_)>;
146 :
args_{argv + 1, argv + argc} {}
149 for (std::string_view arg :
args_) {
150 if (arg ==
"--version") {
152 }
else if (arg ==
"--help") {
155 if (arg.starts_with(
'-')) {
157 [arg](
auto&... a) { (a.TryParseFlag(arg), ...); },
161 [arg](
auto&... a) { (a.TryParseValue(arg), ...); },
170 std::println(
"{} (coreutilspp) version {}\n\n{}",
171 Program::name.PrintableView(),
178 std::println(Program::usage.PrintableView());
179 std::println(Program::summary.PrintableView());
180 std::println(
"\t{:<15}{:<}",
"--help",
"display this help and exit");
181 std::println(
"\t{:<15}{:<}",
"--version",
182 "output version information and exit");
183 (std::println(
"\t{}", Args::help_view_), ...);
200 "Copyright (C) 2025 Free Software Foundation, Inc.\nLicense GPLv3+: "
201 "GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.\nThis "
202 "is free software: you are free to change and redistribute it.\nThere "
203 "is NO WARRANTY, to the extent permitted by law."};
static constexpr std::string_view license_info_
Definition ArgumentParser.hpp:199
constexpr Out & get()
Definition ArgumentParser.hpp:188
std::tuple< Args... > arg_values_
Definition ArgumentParser.hpp:197
constexpr ArgumentParser(int argc, const char **argv)
Definition ArgumentParser.hpp:145
constexpr auto ParseArgsOrExit()
Definition ArgumentParser.hpp:148
constexpr void PrintHelp() const
Definition ArgumentParser.hpp:177
std::span< const char * > args_
Definition ArgumentParser.hpp:196
constexpr void PrintVersion() const
Definition ArgumentParser.hpp:169
Definition ArgumentParser.hpp:137
Definition ArgumentParser.hpp:76
Definition ArgumentParser.hpp:69
Definition ArgumentParser.hpp:119
Definition ArgumentParser.hpp:122
Definition ArgumentParser.hpp:116
Definition ArgumentParser.hpp:127
Definition ArgumentParser.hpp:73
Definition ArgumentParser.hpp:63
implmentation details for the coreutlspp-wide argument parser
@ One
Definition ArgumentParser.hpp:72
@ Many
Definition ArgumentParser.hpp:73
@ None
Definition ArgumentParser.hpp:71
Definition ArgumentParser.hpp:36
detail::Argument< T, detail::NArgs::Many, Converter, Names... > MultiValueArgument
Definition ArgumentParser.hpp:39
decltype(auto) is_conversion_info_v
Definition ArgumentParser.hpp:103
detail::Argument< T, detail::NArgs::Many, Converter, ""> PositionalArguments
Definition ArgumentParser.hpp:43
detail::Argument< void, detail::NArgs::None,[](std::string_view) {}, Names... > BooleanArgument
Definition ArgumentParser.hpp:47
detail::Argument< T, detail::NArgs::One, Converter, Names... > SingleValueArgument
Definition ArgumentParser.hpp:51
Definition ArgumentParser.hpp:55
static constexpr std::string_view help_text
Definition ArgumentParser.hpp:58
static constexpr std::array< std::string_view, sizeof...(Names)> names
Definition ArgumentParser.hpp:57
Definition ArgumentParser.hpp:82
static constexpr decltype(Converter) Fn
Definition ArgumentParser.hpp:84
ConvertedType type
Definition ArgumentParser.hpp:83
Definition ArgumentParser.hpp:131
Definition ArgumentParser.hpp:134
Definition ArgumentParser.hpp:89
static constexpr detail::ComptimeString summary
Definition ArgumentParser.hpp:93
static constexpr detail::ComptimeString usage
Definition ArgumentParser.hpp:92
static constexpr detail::ComptimeString version
Definition ArgumentParser.hpp:91
static constexpr detail::ComptimeString name
Definition ArgumentParser.hpp:90
Definition ArgumentParser.hpp:103
Definition ArgumentParser.hpp:40
consteval std::string_view PrintableView() const
Definition ArgumentParser.hpp:52
Definition ArgumentParser.hpp:97
Definition ArgumentParser.hpp:107