/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
*/
-#ifndef FOLLY_NESTEDCOMMANDLINEAPP_H_
-#define FOLLY_NESTEDCOMMANDLINEAPP_H_
+#pragma once
#include <functional>
#include <stdexcept>
/**
* Exception that commands may throw to force the program to exit cleanly
- * with a non-zero exit code. NestedCommandLineApp::run() catches this and
+ * with a given exit code. NestedCommandLineApp::run() catches this and
* makes run() print the given message on stderr (followed by a newline, unless
- * empty), and return the exit code. (Other exceptions will propagate out of
- * run())
+ * empty; the message is only allowed when exiting with a non-zero status), and
+ * return the exit code. (Other exceptions will propagate out of run())
*/
class ProgramExit : public std::runtime_error {
public:
explicit NestedCommandLineApp(
std::string programName = std::string(),
std::string version = std::string(),
+ std::string programHeading = std::string(),
+ std::string programHelpFooter = std::string(),
InitFunction initFunction = InitFunction());
/**
* Run the command and return; the return code is 0 on success or
* non-zero on error, so it is idiomatic to call this at the end of main():
* return app.run(argc, argv);
+ *
+ * On successful exit, run() will check for errors on stdout (and flush
+ * it) to help command-line applications that need to write to stdout
+ * (failing to write to stdout is an error). If there is an error on stdout,
+ * we'll print a helpful message on stderr and return an error status (1).
*/
int run(int argc, const char* const argv[]);
int run(const std::vector<std::string>& args);
const std::vector<std::string>& args);
std::string programName_;
+ std::string programHeading_;
+ std::string programHelpFooter_;
std::string version_;
InitFunction initFunction_;
boost::program_options::options_description globalOptions_;
std::map<std::string, std::string> aliases_;
};
-} // namespaces
-
-#endif /* FOLLY_NESTEDCOMMANDLINEAPP_H_ */
+} // namespace folly