31SEQAN3_DEPRECATED_HEADER(
"This header and its functionality is deprecated and will be removed in a future version of SeqAn. Please use the sharg-parser (url: https://github.com/seqan/sharg-parser) instead.");
176 char const *
const *
const argv,
180 subcommands{
std::move(subcommands)}
184 throw design_error{(
"The application name must only contain alpha-numeric characters or '_' and '-' "
185 "(regex: \"^[a-zA-Z0-9_-]+$\").")};
188 for (
auto & sub : this->subcommands)
192 throw design_error{
"The subcommand name must only contain alpha-numeric characters or '_' and '-' "
193 "(regex: \"^[a-zA-Z0-9_-]+$\")."};
206 if (version_check_future.
valid())
234 template <
typename option_type, val
idator val
idator_type = detail::default_val
idator<option_type>>
237 && std::invocable<validator_type, option_type>
245 if (sub_parser !=
nullptr)
246 throw design_error{
"You may only specify flags for the top-level parser."};
248 verify_identifiers(short_id, long_id);
252 [=, &value](
auto & f)
254 f.add_option(value, short_id, long_id, desc, spec, option_validator);
277 throw design_error(
"A flag's default value must be false.");
283 [=, &value](
auto &
f)
310 template <
typename option_type, val
idator val
idator_type = detail::default_val
idator<option_type>>
313 && std::invocable<validator_type, option_type>
318 if (sub_parser !=
nullptr)
319 throw design_error{
"You may only specify flags for the top-level parser."};
321 if (has_positional_list_option)
322 throw design_error{
"You added a positional option with a list value before so you cannot add "
323 "any other positional options."};
325 if constexpr (detail::is_container_option<option_type>)
326 has_positional_list_option =
true;
331 [=, &value](
auto & f)
333 f.add_positional_option(value, desc, option_validator);
406 if (parse_was_called)
407 throw design_error(
"The function parse() must only be called once!");
411 if (std::holds_alternative<detail::format_parse>(format) && !subcommands.
empty() && sub_parser ==
nullptr)
413 throw too_few_arguments{detail::to_string(
"You either forgot or misspelled the subcommand! Please specify"
414 " which sub-program you want to use: one of ",
416 ". Use -h/--help for more information.")};
419 if (
app_version.decide_if_check_is_performed(version_check_dev_decision, version_check_user_decision))
433 parse_was_called =
true;
440 if (sub_parser ==
nullptr)
442 throw design_error(
"No subcommand was provided at the construction of the argument parser!");
474 template <
typename id_type>
475 requires std::same_as<id_type, char> || std::constructible_from<std::string, id_type>
478 if (!parse_was_called)
479 throw design_error{
"You can only ask which options have been set after calling the function `parse()`."};
485 if constexpr (!std::same_as<id_type, char>)
490 +
"' was meant to be a short identifier, please pass it as a char ('') not a string"
496 throw design_error{
"You can only ask for option identifiers that you added with add_option() before."};
640 bool parse_was_called{
false};
643 bool has_positional_list_option{
false};
652 friend struct ::seqan3::detail::test_accessor;
658 std::regex app_name_regex{
"^[a-zA-Z0-9_-]+$"};
678 detail::format_short_help,
679 detail::format_version,
682 detail::format_copyright
683> format{detail::format_help{{},
false}};
686 std::set<std::string> used_option_ids{
"h",
"hh",
"help",
"advanced-help",
"export-help",
"version",
"copyright"};
723 void init(
int argc,
char const *
const *
const argv)
727 format = detail::format_short_help{};
731 bool special_format_was_set{
false};
733 for (
int i = 1, argv_len = argc; i < argv_len; ++i)
739 sub_parser = std::make_unique<argument_parser>(
info.
app_name +
"-" + arg,
746 if (arg ==
"-h" || arg ==
"--help")
748 format = detail::format_help{subcommands,
false};
749 init_standard_options();
750 special_format_was_set =
true;
752 else if (arg ==
"-hh" || arg ==
"--advanced-help")
754 format = detail::format_help{subcommands,
true};
755 init_standard_options();
756 special_format_was_set =
true;
758 else if (arg ==
"--version")
760 format = detail::format_version{};
761 special_format_was_set =
true;
763 else if (arg.substr(0, 13) ==
"--export-help")
769 export_format = arg.
substr(14);
773 if (argv_len <= i + 1)
774 throw too_few_arguments{
"Option --export-help must be followed by a value."};
775 export_format = argv[i + 1];
778 if (export_format ==
"html")
779 format = detail::format_html{subcommands};
780 else if (export_format ==
"man")
781 format = detail::format_man{subcommands};
786 throw validation_error{
"Validation failed for option --export-help: "
787 "Value must be one of [html, man]"};
788 init_standard_options();
789 special_format_was_set =
true;
791 else if (arg ==
"--copyright")
793 format = detail::format_copyright{};
794 special_format_was_set =
true;
796 else if (arg ==
"--version-check")
799 throw too_few_arguments{
"Option --version-check must be followed by a value."};
803 if (arg ==
"1" || arg ==
"true")
804 version_check_user_decision =
true;
805 else if (arg ==
"0" || arg ==
"false")
806 version_check_user_decision =
false;
808 throw validation_error{
"Value for option --version-check must be true (1) or false (0)."};
819 if (!special_format_was_set)
820 format = detail::format_parse(argc, cmd_arguments);
824 void init_standard_options()
827 add_list_item(
"\fB-h\fP, \fB--help\fP",
"Prints the help page.");
828 add_list_item(
"\fB-hh\fP, \fB--advanced-help\fP",
"Prints the help page including advanced options.");
829 add_list_item(
"\fB--version\fP",
"Prints the version information.");
830 add_list_item(
"\fB--copyright\fP",
"Prints the copyright/license information.");
832 "Export the help page information. Value must be one of [html, man].");
835 "Whether to check for the newest app version. Default: true.");
843 template <
typename id_type>
844 bool id_exists(id_type
const &
id)
846 if (detail::format_parse::is_empty_id(
id))
860 void verify_identifiers(
char const short_id,
std::string const & long_id)
864 if (id_exists(short_id))
865 throw design_error(
"Option Identifier '" +
std::string(1, short_id) +
"' was already used before.");
866 if (id_exists(long_id))
867 throw design_error(
"Option Identifier '" + long_id +
"' was already used before.");
868 if (long_id.
length() == 1)
869 throw design_error(
"Long IDs must be either empty, or longer than one character.");
870 if (!allowed(short_id) && !
is_char<
'\0'>(short_id))
871 throw design_error(
"Option identifiers may only contain alphanumeric characters, '_', or '@'.");
872 if (long_id.
size() > 0 &&
is_char<
'-'>(long_id[0]))
873 throw design_error(
"First character of long ID cannot be '-'.");
879 if (!(allowed(c) || is_char<
'-'>(c)))
881 "Long identifiers may only contain alphanumeric characters, '_', '-', or '@'.");
883 if (detail::format_parse::is_empty_id(short_id) && detail::format_parse::is_empty_id(long_id))
884 throw design_error(
"Option Identifiers cannot both be empty.");
The SeqAn command line parser.
Definition argument_parser.hpp:147
void add_positional_option(option_type &value, std::string const &desc, validator_type option_validator=validator_type{})
Adds a positional option to the seqan3::argument_parser.
Definition argument_parser.hpp:314
void add_flag(bool &value, char const short_id, std::string const &long_id, std::string const &desc, option_spec const spec=option_spec::standard)
Adds a flag to the seqan3::argument_parser.
Definition argument_parser.hpp:270
bool is_option_set(id_type const &id) const
Checks whether the option identifier (id) was set on the command line by the user.
Definition argument_parser.hpp:476
argument_parser(argument_parser const &)=delete
Deleted. Holds std::future.
void add_option(option_type &value, char const short_id, std::string const &long_id, std::string const &desc, option_spec const spec=option_spec::standard, validator_type option_validator=validator_type{})
Adds an option to the seqan3::argument_parser.
Definition argument_parser.hpp:238
argument_parser(std::string const app_name, int const argc, char const *const *const argv, update_notifications version_updates=update_notifications::on, std::vector< std::string > subcommands={})
Initializes an seqan3::argument_parser object from the command line arguments.
Definition argument_parser.hpp:174
argument_parser & operator=(argument_parser &&)=default
Defaulted.
~argument_parser()
The destructor.
Definition argument_parser.hpp:203
argument_parser & operator=(argument_parser const &)=delete
Deleted. Holds std::future.
argument_parser_meta_data info
Aggregates all parser related meta data (see seqan3::argument_parser_meta_data struct).
Definition argument_parser.hpp:636
argument_parser(argument_parser &&)=default
Defaulted.
void parse()
Initiates the actual command line parsing.
Definition argument_parser.hpp:404
argument_parser()=delete
Deleted.
void add_line(std::string const &text, bool is_paragraph=false, option_spec const spec=option_spec::standard)
Adds an help page text line to the seqan3::argument_parser.
Definition argument_parser.hpp:548
void add_list_item(std::string const &key, std::string const &desc, option_spec const spec=option_spec::standard)
Adds an help page list item (key-value) to the seqan3::argument_parser.
Definition argument_parser.hpp:577
void add_section(std::string const &title, option_spec const spec=option_spec::standard)
Adds an help page section to the seqan3::argument_parser.
Definition argument_parser.hpp:513
void add_subsection(std::string const &title, option_spec const spec=option_spec::standard)
Adds an help page subsection to the seqan3::argument_parser.
Definition argument_parser.hpp:529
argument_parser & get_sub_parser()
Returns a reference to the sub-parser instance if subcommand parsing was enabled.
Definition argument_parser.hpp:438
A "pretty printer" for most SeqAn data structures and related types.
Definition debug_stream_type.hpp:79
Argument parser exception that is thrown whenever there is an design error directed at the developer ...
Definition exceptions.hpp:150
Argument parser exception thrown when too few arguments are provided.
Definition exceptions.hpp:78
option_spec
Used to further specify argument_parser options/flags.
Definition auxiliary.hpp:249
@ standard
The default were no checking or special displaying is happening.
Definition auxiliary.hpp:250
constexpr auto is_alnum
Checks whether c is a alphanumeric character.
Definition predicate.hpp:194
constexpr auto is_char
Checks whether a given letter is the same as the template non-type argument.
Definition predicate.hpp:60
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
update_notifications
Indicates whether application allows automatic update notifications by the seqan3::argument_parser.
Definition auxiliary.hpp:268
@ off
Automatic update notifications should be disabled.
@ on
Automatic update notifications should be enabled.
SeqAn specific customisations in the standard namespace.
Checks if program is run interactively and retrieves dimensions of terminal (Transferred from seqan2)...
Forward declares seqan3::detail::test_accessor.
Auxiliary for pretty printing of exception messages.
Provides the version check functionality.