Program Listing for File CommandLineParser.cpp

Return to documentation for file (src/CommandLineParser.cpp)

#include "include/CommandLineParser.hpp"

#include <boost/program_options.hpp>
#include <cstdlib>
#include <iostream>
#include <string>

namespace Nextsim {

CommandLineParser::CommandLineParser(int argc, char* argv[])
{
    char oneConfigFile[] = "config-file";
    char manyConfigFiles[] = "config-files";

    boost::program_options::options_description opt("neXtSIM_DG command line options:");
    // clang-format off
    opt.add_options()
            ("help,h", "print help message")
            (oneConfigFile, boost::program_options::value<std::string>(),
                    "specify a configuration file")
            (manyConfigFiles,
                    boost::program_options::value<std::vector<std::string>>()->multitoken(),
                    "specify a list of configuration files" )
             ;
    // clang-format on
    auto parsed = boost::program_options::command_line_parser(argc, argv)
                      .options(opt)
                      .style(boost::program_options::command_line_style::
                              unix_style) // | po::command_line_style::allow_long_disguise)
                      .allow_unregistered()
                      .run();
    boost::program_options::store(parsed, m_arguments);

    // Print help and exit
    if (m_arguments.count("help")) {
        std::cerr << opt << std::endl;
        std::exit(EXIT_SUCCESS);
    }

    // Store the config file names in order. The variables_map does not.
    for (auto& lionOption : parsed.options) {
        if (lionOption.string_key == oneConfigFile || lionOption.string_key == manyConfigFiles) {
            for (auto& stringValue : lionOption.value) {
                m_configFilenames.push_back(stringValue);
            }
        }
    }
}

std::vector<std::string> CommandLineParser::getConfigFileNames() { return m_configFilenames; }

} /* namespace Nextsim */