osb/source/core/StarOptionParser.hpp
2023-06-20 14:33:09 +10:00

85 lines
2.2 KiB
C++

#ifndef STAR_OPTION_PARSER_HPP
#define STAR_OPTION_PARSER_HPP
#include "StarString.hpp"
#include "StarVariant.hpp"
#include "StarOrderedMap.hpp"
#include "StarOrderedSet.hpp"
namespace Star {
STAR_EXCEPTION(OptionParserException, StarException);
// Simple command line argument parsing and help printing, only simple single
// dash flags are supported, no flag combining is allowed and all components
// must be separated by a space.
//
// A 'flag' here refers to a component that is preceded by a dash, like -f or
// -quiet.
//
// Three kinds of things are parsed:
// - 'switches' which are flags that do not have a value, like `-q` for quiet
// - 'parameters' are flags with a value that follows, like `-mode full`
// - 'arguments' are everything else, sorted positionally
class OptionParser {
public:
enum RequirementMode {
Optional,
Required,
Multiple
};
struct Options {
OrderedSet<String> switches;
StringMap<StringList> parameters;
StringList arguments;
};
void setCommandName(String commandName);
void setSummary(String summary);
void setAdditionalHelp(String help);
void addSwitch(String const& flag, String description = {});
void addParameter(String const& flag, String argumentName, RequirementMode mode, String description = {});
void addArgument(String argumentName, RequirementMode mode, String description = {});
// Parse the given arguments into an options set, returns the options parsed
// and a list of all the errors encountered while parsing.
pair<Options, StringList> parseOptions(StringList const& arguments) const;
// Print help text to the given std::ostream
void printHelp(std::ostream& os) const;
private:
struct Switch {
String flag;
String description;
};
struct Parameter {
String flag;
String argument;
RequirementMode requirementMode;
String description;
};
struct Argument {
String argumentName;
RequirementMode requirementMode;
String description;
};
typedef Variant<Switch, Parameter> Option;
String m_commandName;
String m_summary;
String m_additionalHelp;
OrderedHashMap<String, Option> m_options;
List<Argument> m_arguments;
};
}
#endif