39 #ifndef __OPENFLUID_UTILS_COMMANDLINEPARSER_HPP__ 40 #define __OPENFLUID_UTILS_COMMANDLINEPARSER_HPP__ 55 std::string m_LongName;
57 std::string m_ShortName;
63 std::string m_HelpText;
71 m_ValueRequired(false),m_Active(false)
87 const std::string& HelpText,
bool ValueRequired =
false):
88 m_LongName(LongName),m_ShortName(ShortName), m_ValueRequired(ValueRequired), m_HelpText(HelpText),
173 return m_ValueRequired;
189 if ((!m_ValueRequired) || (m_ValueRequired && !m_Value.empty()))
222 std::string m_HelpText;
224 std::map<std::string,CommandLineOption> m_Options;
226 std::map<std::string,CommandLineOption*> m_ShortOptions;
245 m_Name(Name), m_HelpText(HelpText)
285 const std::map<std::string,CommandLineOption>&
options()
321 auto it = m_Options.find(LongName);
323 if (it == m_Options.end())
328 (*it).second.activate(Value);
329 return (*it).second.isActive();
344 auto it = m_ShortOptions.find(ShortName);
346 if (it == m_ShortOptions.end())
351 return (*it).second->getLongName();
366 return (m_Options.find(LongName) != m_Options.end());
381 auto it = m_Options.find(LongName);
383 if (it == m_Options.end())
388 return (*it).second.isValueRequired();
403 auto it = m_Options.find(LongName);
405 return (it != m_Options.end() && (*it).second.isActive());
420 auto it = m_Options.find(LongName);
422 if (it == m_Options.end())
427 return ((*it).second.getValue());
440 for (
auto& Opt : m_Options)
523 std::string m_ProgramName;
525 std::string m_HelpText;
527 std::map<std::string,CommandLineCommand> m_Commands;
529 std::string m_ActiveCommand;
531 std::vector<std::string> m_ExtraArgs;
533 std::string m_ParsingMessage;
557 m_ProgramName(ProgramName), m_HelpText(HelpText), m_HelpAsked(false)
601 return m_ProgramName;
615 return m_ParsingMessage;
629 return m_ActiveCommand;
644 return m_Commands.at(Name);
658 m_Commands[Command.
getName()] = Command;
672 m_Commands[
""].addOption(Option);
685 bool parse(std::list<std::string> ArgValues)
689 while (!ArgValues.empty())
691 std::string Arg = ArgValues.front();
692 ArgValues.pop_front();
697 if (m_ActiveCommand.empty())
698 m_ActiveCommand = Arg;
700 m_ExtraArgs.push_back(Arg);
707 auto it = m_Commands.find(m_ActiveCommand);
708 if (it == m_Commands.end())
710 m_ParsingMessage =
"unknown \""+ m_ActiveCommand +
"\" command";
714 if (Arg ==
"-h" || Arg ==
"--help")
718 else if (Arg.size() < 2)
720 m_ParsingMessage =
"wrong format for option \"" + Arg +
"\"";
725 std::string LongOptName;
726 std::string OptValue;
727 bool IsFromShort =
false;
733 m_ParsingMessage =
"wrong format for short option \"" + Arg +
"\"";
738 LongOptName = m_Commands[m_ActiveCommand].getOptionNameFromShortName(Arg.substr(1,1));
744 std::string TmpName = Arg.substr(2,Arg.size()-2);
746 std::string::size_type EqualPos = TmpName.find(
"=");
748 if (EqualPos != std::string::npos)
750 LongOptName = TmpName.substr(0,EqualPos);
751 OptValue = TmpName.substr(EqualPos+1,TmpName.size()-EqualPos-1);
755 LongOptName = TmpName;
759 if (!m_Commands[m_ActiveCommand].isOptionExists(LongOptName))
762 m_ParsingMessage =
"unknown option \"" + Arg +
"\"";
763 if (!m_ActiveCommand.empty())
765 m_ParsingMessage +=
" for command \"" + m_ActiveCommand +
"\"";
770 if (m_Commands[m_ActiveCommand].isOptionRequiresValue(LongOptName))
772 if (IsFromShort && !ArgValues.empty())
774 OptValue = ArgValues.front();
775 ArgValues.pop_front();
778 if (OptValue.empty())
780 m_ParsingMessage =
"missing value for option \"" + Arg +
"\"";
785 if (!m_Commands[m_ActiveCommand].activateOption(LongOptName,OptValue))
788 m_ParsingMessage =
"unknown error for option \"" + Arg +
"\"";
810 std::list<std::string> ArgValues;
812 for (
int i=1; i< ArgC; i++)
814 ArgValues.push_back(std::string(ArgV[i]));
817 return parse(ArgValues);
830 m_ActiveCommand.clear();
831 m_ParsingMessage.clear();
834 for (
auto& Cmd : m_Commands)
865 std::string m_CmdName = m_ActiveCommand;
867 if (m_CmdName.empty())
869 m_CmdName =
"[<command>]";
872 OutStm <<
"Usage : " << m_ProgramName <<
" " << m_CmdName <<
" [<options>] [<args>]\n";
874 if (m_ActiveCommand.empty())
876 OutStm <<
"\nAvailable commands:\n";
878 for (
auto& Cmd : m_Commands)
880 if (!Cmd.first.empty())
882 OutStm <<
" " << Cmd.first <<
" : " << Cmd.second.getHelpText() <<
"\n";
887 if (!m_Commands[m_ActiveCommand].
getHelpText().empty())
889 OutStm <<
"\n" << m_Commands[m_ActiveCommand].getHelpText() <<
"\n";
892 OutStm <<
"\nAvailable options:\n";
893 OutStm <<
" --help,-h : display this help message\n";
895 for (
auto& Opt : m_Commands[m_ActiveCommand].options())
897 OutStm <<
" --" << Opt.second.getLongName();
898 if (Opt.second.isValueRequired())
903 if (!Opt.second.getShortName().empty())
905 OutStm <<
", -" << Opt.second.getShortName();
906 if (Opt.second.isValueRequired())
912 OutStm <<
" : " << Opt.second.getHelpText() <<
"\n";
927 for (
auto& Cmd : m_Commands)
929 if (!Cmd.first.empty())
931 if (Cmd.first == m_ActiveCommand)
940 OutStm <<
" " << Cmd.first <<
" : " << Cmd.second.getHelpText() <<
"\n";
942 for (
auto& Opt : Cmd.second.options())
946 if (Opt.second.isActive())
954 OutStm <<
" " << Opt.first;
956 if (!Opt.second.getShortName().empty())
958 OutStm <<
"," << Opt.second.getShortName();
961 if (Opt.second.isValueRequired())
963 OutStm <<
"[" << Opt.second.getValue() <<
"]";
966 OutStm <<
" : " << Opt.second.getHelpText() <<
"\n";
972 if (!m_ExtraArgs.empty())
974 OutStm <<
"Extra arguments :";
976 for (
auto& Arg : m_ExtraArgs)
978 OutStm <<
" " << Arg;
std::string getOptionValue(const std::string &LongName) const
Definition: CommandLineParser.hpp:418
Definition: CommandLineParser.hpp:51
std::string getActiveCommand() const
Definition: CommandLineParser.hpp:627
const CommandLineCommand & command(const std::string &Name) const
Definition: CommandLineParser.hpp:642
std::string getOptionNameFromShortName(const std::string &ShortName) const
Definition: CommandLineParser.hpp:342
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:670
std::string getProgramName() const
Definition: CommandLineParser.hpp:599
bool parse(std::list< std::string > ArgValues)
Definition: CommandLineParser.hpp:685
bool isOptionExists(const std::string &LongName) const
Definition: CommandLineParser.hpp:364
bool isHelpAsked()
Definition: CommandLineParser.hpp:849
bool activateOption(const std::string &LongName, const std::string &Value="")
Definition: CommandLineParser.hpp:319
std::string getParsingMessage() const
Definition: CommandLineParser.hpp:613
bool isValueRequired() const
Definition: CommandLineParser.hpp:171
bool isOptionRequiresValue(const std::string &LongName) const
Definition: CommandLineParser.hpp:379
std::string getValue() const
Definition: CommandLineParser.hpp:143
void reset()
Definition: CommandLineParser.hpp:203
Class for management of command line arguments.
Definition: CommandLineParser.hpp:519
CommandLineCommand()
Definition: CommandLineParser.hpp:231
CommandLineCommand(const std::string &Name, const std::string &HelpText)
Definition: CommandLineParser.hpp:244
void printHelp(std::ostream &OutStm)
Definition: CommandLineParser.hpp:863
std::string getHelpText() const
Definition: CommandLineParser.hpp:257
CommandLineParser(const std::string &ProgramName, const std::string &HelpText)
Definition: CommandLineParser.hpp:556
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:299
void addCommand(const CommandLineCommand &Command)
Definition: CommandLineParser.hpp:656
Definition: CommandLineParser.hpp:216
const std::vector< std::string > & extraArgs() const
Definition: CommandLineParser.hpp:571
std::string getHelpText() const
Definition: CommandLineParser.hpp:585
bool parse(int ArgC, char **ArgV)
Definition: CommandLineParser.hpp:808
std::string getShortName() const
Definition: CommandLineParser.hpp:129
bool isActive() const
Definition: CommandLineParser.hpp:157
Definition: ApplicationException.hpp:47
bool isOptionActive(const std::string &LongName) const
Definition: CommandLineParser.hpp:401
const std::map< std::string, CommandLineOption > & options()
Definition: CommandLineParser.hpp:285
std::string getLongName() const
Definition: CommandLineParser.hpp:115
CommandLineOption()
Definition: CommandLineParser.hpp:70
CommandLineOption(const std::string &LongName, const std::string &ShortName, const std::string &HelpText, bool ValueRequired=false)
Definition: CommandLineParser.hpp:86
void activate(const std::string &Value="")
Definition: CommandLineParser.hpp:185
std::string getName() const
Definition: CommandLineParser.hpp:271
std::string getHelpText() const
Definition: CommandLineParser.hpp:101
void reset()
Definition: CommandLineParser.hpp:828
void reset()
Definition: CommandLineParser.hpp:438
void printState(std::ostream &OutStm)
Definition: CommandLineParser.hpp:925
CommandLineParser()
Definition: CommandLineParser.hpp:540