Closes #113, add custom std::ostream& argument to ArgumentParser constructor

This commit is contained in:
Pranav Srinivas Kumar 2023-11-04 09:31:13 -05:00
parent 7a3e0f1cb3
commit 281f1ab017
4 changed files with 28 additions and 5 deletions

View File

@ -1361,14 +1361,15 @@ public:
explicit ArgumentParser(std::string program_name = {},
std::string version = "1.0",
default_arguments add_args = default_arguments::all,
bool exit_on_default_arguments = true)
bool exit_on_default_arguments = true,
std::ostream &os = std::cout)
: m_program_name(std::move(program_name)), m_version(std::move(version)),
m_exit_on_default_arguments(exit_on_default_arguments),
m_parser_path(m_program_name) {
if ((add_args & default_arguments::help) == default_arguments::help) {
add_argument("-h", "--help")
.action([&](const auto & /*unused*/) {
std::cout << help().str();
os << help().str();
if (m_exit_on_default_arguments) {
std::exit(0);
}
@ -1381,7 +1382,7 @@ public:
if ((add_args & default_arguments::version) == default_arguments::version) {
add_argument("-v", "--version")
.action([&](const auto & /*unused*/) {
std::cout << m_version << std::endl;
os << m_version << std::endl;
if (m_exit_on_default_arguments) {
std::exit(0);
}

View File

@ -49,6 +49,7 @@ file(GLOB ARGPARSE_TEST_SOURCES
test_repr.cpp
test_required_arguments.cpp
test_scan.cpp
test_stringstream.cpp
test_value_semantics.cpp
test_version.cpp
test_subparsers.cpp

View File

@ -35,7 +35,8 @@ TEST_CASE("Missing optional argument name" * test_suite("error_reporting")) {
}
}
TEST_CASE("Missing optional argument name (some flag arguments)" * test_suite("error_reporting")) {
TEST_CASE("Missing optional argument name (some flag arguments)" *
test_suite("error_reporting")) {
argparse::ArgumentParser parser("test");
parser.add_argument("-a").flag();
parser.add_argument("-b").flag();

View File

@ -0,0 +1,20 @@
#ifdef WITH_MODULE
import argparse;
#else
#include <argparse/argparse.hpp>
#endif
#include <doctest.hpp>
#include <cmath>
#include <string>
#include <vector>
using doctest::test_suite;
TEST_CASE("Get Version String" * test_suite("stringstream")) {
std::stringstream os;
argparse::ArgumentParser program("test", "1.0",
argparse::default_arguments::all, false, os);
program.parse_args({"test", "--version"});
REQUIRE(os.str() == "1.0\n");
}