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)
80 const std::string& HelpText,
bool ValueRequired =
false):
81 m_LongName(LongName),m_ShortName(ShortName), m_ValueRequired(ValueRequired), m_HelpText(HelpText),
91 {
return m_HelpText; }
99 {
return m_LongName; }
107 {
return m_ShortName; }
131 {
return m_ValueRequired; }
142 if ((!m_ValueRequired) || (m_ValueRequired && !m_Value.empty()))
172 std::string m_HelpText;
174 std::map<std::string,CommandLineOption> m_Options;
176 std::map<std::string,CommandLineOption*> m_ShortOptions;
190 m_Name(Name), m_HelpText(HelpText)
199 {
return m_HelpText; }
214 const std::map<std::string,CommandLineOption>&
options()
215 {
return m_Options; }
237 auto it = m_Options.find(LongName);
239 if (it == m_Options.end())
242 (*it).second.activate(Value);
243 return (*it).second.isActive();
253 auto it = m_ShortOptions.find(ShortName);
255 if (it == m_ShortOptions.end())
258 return (*it).second->getLongName();
268 return (m_Options.find(LongName) != m_Options.end());
278 auto it = m_Options.find(LongName);
280 if (it == m_Options.end())
283 return (*it).second.isValueRequired();
294 auto it = m_Options.find(LongName);
296 return (it != m_Options.end() && (*it).second.isActive());
306 auto it = m_Options.find(LongName);
308 if (it == m_Options.end())
311 return ((*it).second.getValue());
321 for (
auto& Opt : m_Options)
336 std::string m_ProgramName;
338 std::string m_HelpText;
340 std::map<std::string,CommandLineCommand> m_Commands;
342 std::string m_ActiveCommand;
344 std::vector<std::string> m_ExtraArgs;
346 std::string m_ParsingMessage;
365 m_ProgramName(ProgramName), m_HelpText(HelpText), m_HelpAsked(false)
376 {
return m_ExtraArgs; }
384 {
return m_HelpText; }
392 {
return m_ProgramName; }
400 {
return m_ParsingMessage; }
408 {
return m_ActiveCommand; }
417 return m_Commands.at(Name);
427 m_Commands[Command.
getName()] = Command;
436 m_Commands[
""].addOption(Option);
444 bool parse(std::list<std::string> ArgValues)
448 while (!ArgValues.empty())
450 std::string Arg = ArgValues.front();
451 ArgValues.pop_front();
456 if (m_ActiveCommand.empty())
457 m_ActiveCommand = Arg;
459 m_ExtraArgs.push_back(Arg);
466 auto it = m_Commands.find(m_ActiveCommand);
467 if (it == m_Commands.end())
469 m_ParsingMessage =
"unknown \""+ m_ActiveCommand +
"\" command";
473 if (Arg ==
"-h" || Arg ==
"--help")
475 else if (Arg.size() < 2)
477 m_ParsingMessage =
"wrong format for option \"" + Arg +
"\"";
482 std::string LongOptName;
483 std::string OptValue;
484 bool IsFromShort =
false;
490 m_ParsingMessage =
"wrong format for short option \"" + Arg +
"\"";
495 LongOptName = m_Commands[m_ActiveCommand].getOptionNameFromShortName(Arg.substr(1,1));
501 std::string TmpName = Arg.substr(2,Arg.size()-2);
503 std::string::size_type EqualPos = TmpName.find(
"=");
505 if (EqualPos != std::string::npos)
507 LongOptName = TmpName.substr(0,EqualPos);
508 OptValue = TmpName.substr(EqualPos+1,TmpName.size()-EqualPos-1);
511 LongOptName = TmpName;
514 if (!m_Commands[m_ActiveCommand].isOptionExists(LongOptName))
517 m_ParsingMessage =
"unknown option \"" + Arg +
"\"";
518 if (!m_ActiveCommand.empty())
519 m_ParsingMessage +=
" for command \"" + m_ActiveCommand +
"\"";
523 if (m_Commands[m_ActiveCommand].isOptionRequiresValue(LongOptName))
525 if (IsFromShort && !ArgValues.empty())
527 OptValue = ArgValues.front();
528 ArgValues.pop_front();
531 if (OptValue.empty())
533 m_ParsingMessage =
"missing value for option \"" + Arg +
"\"";
538 if (!m_Commands[m_ActiveCommand].activateOption(LongOptName,OptValue))
541 m_ParsingMessage =
"unknown error for option \"" + Arg +
"\"";
557 std::list<std::string> ArgValues;
559 for (
int i=1; i< ArgC; i++)
560 ArgValues.push_back(std::string(ArgV[i]));
562 return parse(ArgValues);
572 m_ActiveCommand.clear();
573 m_ParsingMessage.clear();
576 for (
auto& Cmd : m_Commands)
586 {
return m_HelpAsked; }
595 std::string m_CmdName = m_ActiveCommand;
596 if (m_CmdName.empty())
597 m_CmdName =
"[<command>]";
599 OutStm <<
"Usage : " << m_ProgramName <<
" " << m_CmdName <<
" [<options>] [<args>]\n";
601 if (m_ActiveCommand.empty())
603 OutStm <<
"\nAvailable commands:\n";
605 for (
auto& Cmd : m_Commands)
606 if (!Cmd.first.empty())
607 OutStm <<
" " << Cmd.first <<
" : " << Cmd.second.getHelpText() <<
"\n";
610 if (!m_Commands[m_ActiveCommand].
getHelpText().empty())
611 OutStm <<
"\n" << m_Commands[m_ActiveCommand].getHelpText() <<
"\n";
613 OutStm <<
"\nAvailable options:\n";
614 OutStm <<
" --help,-h : display this help message\n";
616 for (
auto& Opt : m_Commands[m_ActiveCommand].options())
618 OutStm <<
" --" << Opt.second.getLongName();
619 if (Opt.second.isValueRequired())
622 if (!Opt.second.getShortName().empty())
624 OutStm <<
", -" << Opt.second.getShortName();
625 if (Opt.second.isValueRequired())
629 OutStm <<
" : " << Opt.second.getHelpText() <<
"\n";
640 for (
auto& Cmd : m_Commands)
642 if (!Cmd.first.empty())
644 if (Cmd.first == m_ActiveCommand)
648 OutStm <<
" " << Cmd.first <<
" : " << Cmd.second.getHelpText() <<
"\n";
650 for (
auto& Opt : Cmd.second.options())
654 if (Opt.second.isActive())
658 OutStm <<
" " << Opt.first;
660 if (!Opt.second.getShortName().empty())
661 OutStm <<
"," << Opt.second.getShortName();
663 if (Opt.second.isValueRequired())
664 OutStm <<
"[" << Opt.second.getValue() <<
"]";
666 OutStm <<
" : " << Opt.second.getHelpText() <<
"\n";
672 if (!m_ExtraArgs.empty())
674 OutStm <<
"Extra arguments :";
675 for (
auto& Arg : m_ExtraArgs)
676 OutStm <<
" " << Arg;
bool isOptionActive(const std::string &LongName) const
Definition: CommandLineParser.hpp:292
const std::vector< std::string > & extraArgs() const
Definition: CommandLineParser.hpp:375
Definition: CommandLineParser.hpp:166
std::string getName() const
Definition: CommandLineParser.hpp:206
void printHelp(std::ostream &OutStm)
Definition: CommandLineParser.hpp:593
std::string getShortName() const
Definition: CommandLineParser.hpp:106
bool activateOption(const std::string &LongName, const std::string &Value="")
Definition: CommandLineParser.hpp:235
std::string getParsingMessage() const
Definition: CommandLineParser.hpp:399
std::string getOptionValue(const std::string &LongName) const
Definition: CommandLineParser.hpp:304
std::string getLongName() const
Definition: CommandLineParser.hpp:98
CommandLineCommand()
Definition: CommandLineParser.hpp:181
Definition: CommandLineParser.hpp:51
void reset()
Definition: CommandLineParser.hpp:319
std::string getActiveCommand() const
Definition: CommandLineParser.hpp:407
CommandLineParser()
Definition: CommandLineParser.hpp:353
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:434
void addCommand(const CommandLineCommand &Command)
Definition: CommandLineParser.hpp:425
bool isHelpAsked()
Definition: CommandLineParser.hpp:585
std::string getHelpText() const
Definition: CommandLineParser.hpp:90
CommandLineOption()
Definition: CommandLineParser.hpp:70
std::string getValue() const
Definition: CommandLineParser.hpp:114
CommandLineCommand(const std::string &Name, const std::string &HelpText)
Definition: CommandLineParser.hpp:189
void printState(std::ostream &OutStm)
Definition: CommandLineParser.hpp:638
const CommandLineCommand & command(const std::string &Name) const
Definition: CommandLineParser.hpp:415
std::string getHelpText() const
Definition: CommandLineParser.hpp:383
bool isValueRequired() const
Definition: CommandLineParser.hpp:130
bool isOptionRequiresValue(const std::string &LongName) const
Definition: CommandLineParser.hpp:276
bool parse(std::list< std::string > ArgValues)
Definition: CommandLineParser.hpp:444
bool parse(int ArgC, char **ArgV)
Definition: CommandLineParser.hpp:555
const std::map< std::string, CommandLineOption > & options()
Definition: CommandLineParser.hpp:214
std::string getOptionNameFromShortName(const std::string &ShortName) const
Definition: CommandLineParser.hpp:251
void reset()
Definition: CommandLineParser.hpp:570
CommandLineParser(const std::string &ProgramName, const std::string &HelpText)
Definition: CommandLineParser.hpp:364
void reset()
Definition: CommandLineParser.hpp:153
std::string getHelpText() const
Definition: CommandLineParser.hpp:198
bool isActive() const
Definition: CommandLineParser.hpp:122
Definition: CommandLineParser.hpp:332
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:222
std::string getProgramName() const
Definition: CommandLineParser.hpp:391
bool isOptionExists(const std::string &LongName) const
Definition: CommandLineParser.hpp:266
CommandLineOption(const std::string &LongName, const std::string &ShortName, const std::string &HelpText, bool ValueRequired=false)
Definition: CommandLineParser.hpp:79
void activate(const std::string &Value="")
Definition: CommandLineParser.hpp:138
Definition: ApplicationException.hpp:47