GitHub Viewer
/*
* ProgramOptions.cpp
*
* Copyright (C) 2022 by Posit Software, PBC
*
* Unless you have received this program directly from Posit Software pursuant
* to the terms of a commercial license agreement with Posit Software, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
#include
#include
#include
#include
#include
#include
using namespace boost::program_options;
namespace rstudio {
namespace core {
namespace program_options {
namespace {
enum class OptionsParseState
{
Initial,
ConfigFile,
CommandLine
};
bool validateOptionsProvided(const variables_map& vm,
const options_description& optionsDescription,
const std::string& configFile = std::string())
{
for (const auto& pOptionsDesc : optionsDescription.options())
{
std::string optionName = pOptionsDesc->long_name();
if ( !(vm.count(optionName)) )
{
std::string msg = "Required option " + optionName + " not specified";
if (!configFile.empty())
msg += " in config file " + configFile;
reportError(msg, ERROR_LOCATION, true);
return false;
}
}
// all options validated
return true;
}
}
void reportError(const Error& error, const ErrorLocation& location, bool forceStderr)
{
std::string description = error.getProperty("description");
// in some cases, we may need to force stderr to be written
// for example, during installation on RedHat systems, stderr
// is not properly hooked up to a terminal when checking configuration during post install scripts
// which would cause error output to go only to syslog and be hidden from view during install
if ((forceStderr || core::system::stderrIsTerminal()) && !description.empty())
{
std::cerr