parse positional arguments

This commit is contained in:
Jarryd Beck 2014-10-09 11:08:36 +11:00
parent e85c2aa282
commit 8701a5d7ca
3 changed files with 62 additions and 4 deletions

View File

@ -116,6 +116,39 @@ Options::checked_parse_arg
parse_option(value, name, argv[argPos]); parse_option(value, name, argv[argPos]);
} }
void
Options::add_to_option(const std::string& option, const std::string& arg)
{
auto iter = m_options.find(option);
if (iter == m_options.end())
{
throw option_not_exists_exception(option);
}
parse_option(iter->second, option, arg);
}
bool
Options::consume_positional(std::string a)
{
if (m_positional.size() > 0)
{
add_to_option(m_positional, a);
return true;
}
else
{
return false;
}
}
void
Options::parse_positional(std::string option)
{
m_positional = std::move(option);
}
void void
Options::parse(int& argc, char**& argv) Options::parse(int& argc, char**& argv)
{ {
@ -130,11 +163,16 @@ Options::parse(int& argc, char**& argv)
if (result.empty()) if (result.empty())
{ {
//handle empty //not a flag
//for now, throw an exception
throw option_not_exists_exception(argv[current]);
//if true is returned here then it was consumed, otherwise it is
//ignored
if (consume_positional(argv[current]))
{
}
else
{
}
//if we return from here then it was parsed successfully, so continue //if we return from here then it was parsed successfully, so continue
} }
else else

View File

@ -312,9 +312,19 @@ namespace cxxopts
return *iter->second; return *iter->second;
} }
//parse positional arguments into the given option
void
parse_positional(std::string option);
private: private:
friend class OptionAdder; friend class OptionAdder;
bool
consume_positional(std::string a);
void
add_to_option(const std::string& option, const std::string& arg);
void void
parse_option parse_option
( (
@ -335,6 +345,7 @@ namespace cxxopts
std::map<std::string, std::shared_ptr<OptionDetails>> m_options; std::map<std::string, std::shared_ptr<OptionDetails>> m_options;
std::string m_positional;
}; };
class OptionAdder class OptionAdder

View File

@ -37,8 +37,11 @@ int main(int argc, char* argv[])
("a,apple", "an apple") ("a,apple", "an apple")
("b,bob", "Bob") ("b,bob", "Bob")
("f,file", "File", cxxopts::value<std::string>()) ("f,file", "File", cxxopts::value<std::string>())
("positional", "Positional arguments", cxxopts::value<std::string>())
; ;
options.parse_positional("positional");
options.parse(argc, argv); options.parse(argc, argv);
if (options.count("a")) if (options.count("a"))
@ -62,6 +65,12 @@ int main(int argc, char* argv[])
//std::cout << options.print_help(); //std::cout << options.print_help();
} }
if (options.count("positional"))
{
std::cout << "Positional = " << options["positional"].as<std::string>()
<< std::endl;
}
} catch (const cxxopts::OptionException& e) } catch (const cxxopts::OptionException& e)
{ {
std::cout << "error parsing options: " << e.what() << std::endl; std::cout << "error parsing options: " << e.what() << std::endl;