39 #ifndef __OPENFLUID_UTILS_COMMANDLINEPARSER_HPP__ 40 #define __OPENFLUID_UTILS_COMMANDLINEPARSER_HPP__ 57 std::string m_LongName;
59 std::string m_ShortName;
65 std::string m_HelpText;
73 m_ValueRequired(false),m_Active(false)
89 const std::string& HelpText,
bool ValueRequired =
false):
90 m_LongName(LongName),m_ShortName(ShortName), m_ValueRequired(ValueRequired), m_HelpText(HelpText),
175 return m_ValueRequired;
191 if ((!m_ValueRequired) || (m_ValueRequired && !m_Value.empty()))
228 std::string m_HelpText;
230 std::map<std::string,CommandLineOption> m_Options;
232 std::map<std::string,CommandLineOption*> m_ShortOptions;
251 m_Name(Name), m_HelpText(HelpText)
291 const std::map<std::string,CommandLineOption>&
options()
327 auto it = m_Options.find(LongName);
329 if (it == m_Options.end())
334 (*it).second.activate(Value);
335 return (*it).second.isActive();
350 auto it = m_ShortOptions.find(ShortName);
352 if (it == m_ShortOptions.end())
357 return (*it).second->getLongName();
372 return (m_Options.find(LongName) != m_Options.end());
387 auto it = m_Options.find(LongName);
389 if (it == m_Options.end())
394 return (*it).second.isValueRequired();
409 auto it = m_Options.find(LongName);
411 return (it != m_Options.end() && (*it).second.isActive());
426 auto it = m_Options.find(LongName);
428 if (it == m_Options.end())
433 return ((*it).second.getValue());
446 for (
auto& Opt : m_Options)
473 std::string m_ProgramName;
475 std::string m_HelpText;
477 std::map<std::string,CommandLineCommand> m_Commands;
479 std::string m_ActiveCommand;
481 std::vector<std::string> m_ExtraArgs;
483 std::string m_ParsingMessage;
507 m_ProgramName(ProgramName), m_HelpText(HelpText), m_HelpAsked(false)
551 return m_ProgramName;
565 return m_ParsingMessage;
579 return m_ActiveCommand;
594 return m_Commands.at(Name);
608 m_Commands[Command.
getName()] = Command;
622 m_Commands[
""].addOption(Option);
635 bool parse(std::list<std::string> ArgValues)
639 while (!ArgValues.empty())
641 std::string Arg = ArgValues.front();
642 ArgValues.pop_front();
647 if (m_ActiveCommand.empty())
649 m_ActiveCommand = Arg;
653 m_ExtraArgs.push_back(Arg);
661 auto it = m_Commands.find(m_ActiveCommand);
662 if (it == m_Commands.end())
664 m_ParsingMessage =
"unknown \""+ m_ActiveCommand +
"\" command";
668 if (Arg ==
"-h" || Arg ==
"--help")
672 else if (Arg.size() < 2)
674 m_ParsingMessage =
"wrong format for option \"" + Arg +
"\"";
679 std::string LongOptName;
680 std::string OptValue;
681 bool IsFromShort =
false;
687 m_ParsingMessage =
"wrong format for short option \"" + Arg +
"\"";
692 LongOptName = m_Commands[m_ActiveCommand].getOptionNameFromShortName(Arg.substr(1,1));
698 std::string TmpName = Arg.substr(2,Arg.size()-2);
700 std::string::size_type EqualPos = TmpName.find(
"=");
702 if (EqualPos != std::string::npos)
704 LongOptName = TmpName.substr(0,EqualPos);
705 OptValue = TmpName.substr(EqualPos+1,TmpName.size()-EqualPos-1);
709 LongOptName = TmpName;
713 if (!m_Commands[m_ActiveCommand].isOptionExists(LongOptName))
716 m_ParsingMessage =
"unknown option \"" + Arg +
"\"";
717 if (!m_ActiveCommand.empty())
719 m_ParsingMessage +=
" for command \"" + m_ActiveCommand +
"\"";
724 if (m_Commands[m_ActiveCommand].isOptionRequiresValue(LongOptName))
726 if (IsFromShort && !ArgValues.empty())
728 OptValue = ArgValues.front();
729 ArgValues.pop_front();
732 if (OptValue.empty())
734 m_ParsingMessage =
"missing value for option \"" + Arg +
"\"";
739 if (!m_Commands[m_ActiveCommand].activateOption(LongOptName,OptValue))
742 m_ParsingMessage =
"unknown error for option \"" + Arg +
"\"";
764 std::list<std::string> ArgValues;
766 for (
int i=1; i< ArgC; i++)
768 ArgValues.push_back(std::string(ArgV[i]));
771 return parse(ArgValues);
784 m_ActiveCommand.clear();
785 m_ParsingMessage.clear();
788 for (
auto& Cmd : m_Commands)
819 std::string m_CmdName = m_ActiveCommand;
821 if (m_CmdName.empty())
823 m_CmdName =
"[<command>]";
826 OutStm <<
"Usage : " << m_ProgramName <<
" " << m_CmdName <<
" [<options>] [<args>]\n";
828 if (m_ActiveCommand.empty())
830 OutStm <<
"\nAvailable commands:\n";
832 for (
auto& Cmd : m_Commands)
834 if (!Cmd.first.empty())
836 OutStm <<
" " << Cmd.first <<
" : " << Cmd.second.getHelpText() <<
"\n";
841 if (!m_Commands[m_ActiveCommand].
getHelpText().empty())
843 OutStm <<
"\n" << m_Commands[m_ActiveCommand].getHelpText() <<
"\n";
846 OutStm <<
"\nAvailable options:\n";
847 OutStm <<
" --help,-h : display this help message\n";
849 for (
auto& Opt : m_Commands[m_ActiveCommand].options())
851 OutStm <<
" --" << Opt.second.getLongName();
852 if (Opt.second.isValueRequired())
857 if (!Opt.second.getShortName().empty())
859 OutStm <<
", -" << Opt.second.getShortName();
860 if (Opt.second.isValueRequired())
866 OutStm <<
" : " << Opt.second.getHelpText() <<
"\n";
881 for (
auto& Cmd : m_Commands)
883 if (!Cmd.first.empty())
885 if (Cmd.first == m_ActiveCommand)
894 OutStm <<
" " << Cmd.first <<
" : " << Cmd.second.getHelpText() <<
"\n";
896 for (
auto& Opt : Cmd.second.options())
900 if (Opt.second.isActive())
908 OutStm <<
" " << Opt.first;
910 if (!Opt.second.getShortName().empty())
912 OutStm <<
"," << Opt.second.getShortName();
915 if (Opt.second.isValueRequired())
917 OutStm <<
"[" << Opt.second.getValue() <<
"]";
920 OutStm <<
" : " << Opt.second.getHelpText() <<
"\n";
926 if (!m_ExtraArgs.empty())
928 OutStm <<
"Extra arguments :";
930 for (
auto& Arg : m_ExtraArgs)
932 OutStm <<
" " << Arg;
std::string getActiveCommand() const
Definition: CommandLineParser.hpp:577
const std::vector< std::string > & extraArgs() const
Definition: CommandLineParser.hpp:521
CommandLineCommand(const std::string &Name, const std::string &HelpText)
Definition: CommandLineParser.hpp:250
Definition: ApplicationException.hpp:47
Definition: CommandLineParser.hpp:222
std::string getLongName() const
Definition: CommandLineParser.hpp:117
CommandLineCommand()
Definition: CommandLineParser.hpp:237
CommandLineParser()
Definition: CommandLineParser.hpp:490
void reset()
Definition: CommandLineParser.hpp:444
void activate(const std::string &Value="")
Definition: CommandLineParser.hpp:187
std::string getName() const
Definition: CommandLineParser.hpp:277
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:620
bool isValueRequired() const
Definition: CommandLineParser.hpp:173
Definition: CommandLineParser.hpp:53
void reset()
Definition: CommandLineParser.hpp:209
void addCommand(const CommandLineCommand &Command)
Definition: CommandLineParser.hpp:606
bool isOptionActive(const std::string &LongName) const
Definition: CommandLineParser.hpp:407
std::string getOptionValue(const std::string &LongName) const
Definition: CommandLineParser.hpp:424
std::string getShortName() const
Definition: CommandLineParser.hpp:131
bool isHelpAsked()
Definition: CommandLineParser.hpp:803
bool parse(std::list< std::string > ArgValues)
Definition: CommandLineParser.hpp:635
bool parse(int ArgC, char **ArgV)
Definition: CommandLineParser.hpp:762
CommandLineParser(const std::string &ProgramName, const std::string &HelpText)
Definition: CommandLineParser.hpp:506
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:305
std::string getHelpText() const
Definition: CommandLineParser.hpp:263
std::string getProgramName() const
Definition: CommandLineParser.hpp:549
bool isOptionExists(const std::string &LongName) const
Definition: CommandLineParser.hpp:370
CommandLineOption(const std::string &LongName, const std::string &ShortName, const std::string &HelpText, bool ValueRequired=false)
Definition: CommandLineParser.hpp:88
void printState(std::ostream &OutStm)
Definition: CommandLineParser.hpp:879
bool activateOption(const std::string &LongName, const std::string &Value="")
Definition: CommandLineParser.hpp:325
void printHelp(std::ostream &OutStm)
Definition: CommandLineParser.hpp:817
std::string getValue() const
Definition: CommandLineParser.hpp:145
const CommandLineCommand & command(const std::string &Name) const
Definition: CommandLineParser.hpp:592
bool isOptionRequiresValue(const std::string &LongName) const
Definition: CommandLineParser.hpp:385
bool isActive() const
Definition: CommandLineParser.hpp:159
std::string getHelpText() const
Definition: CommandLineParser.hpp:535
const std::map< std::string, CommandLineOption > & options()
Definition: CommandLineParser.hpp:291
Class for management of command line arguments.
Definition: CommandLineParser.hpp:469
std::string getHelpText() const
Definition: CommandLineParser.hpp:103
std::string getOptionNameFromShortName(const std::string &ShortName) const
Definition: CommandLineParser.hpp:348
CommandLineOption()
Definition: CommandLineParser.hpp:72
void reset()
Definition: CommandLineParser.hpp:782
std::string getParsingMessage() const
Definition: CommandLineParser.hpp:563