summaryrefslogtreecommitdiff
path: root/src/parameters_parser.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-12-07 14:27:10 +0100
committerMaxime Coste <frrrwww@gmail.com>2012-12-07 19:20:26 +0100
commit158f5a5c84471618ab19e75a249e79e0ff0e7ef3 (patch)
tree956d974a26121404b99668c429a2dd8f5e5143d1 /src/parameters_parser.cc
parentd25bafa95dd1cd4a2dde79f988ce238ca3628d75 (diff)
extract ParametersParser to it's own file
Diffstat (limited to 'src/parameters_parser.cc')
-rw-r--r--src/parameters_parser.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/parameters_parser.cc b/src/parameters_parser.cc
new file mode 100644
index 00000000..cdcfb0c1
--- /dev/null
+++ b/src/parameters_parser.cc
@@ -0,0 +1,103 @@
+#include "parameters_parser.hh"
+
+namespace Kakoune
+{
+
+ParametersParser::ParametersParser(const ParameterList& params,
+ std::unordered_map<String, bool> options)
+ : m_params(params), m_positional(params.size(), true),
+ m_options(std::move(options))
+{
+ for (size_t i = 0; i < params.size(); ++i)
+ {
+ if (params[i][0] == '-')
+ {
+ auto it = m_options.find(params[i].substr(1_byte));
+ if (it == m_options.end())
+ throw unknown_option(params[i]);
+
+ if (it->second)
+ {
+ if (i + 1 == params.size() or params[i+1][0] == '-')
+ throw missing_option_value(params[i]);
+
+ m_positional[i+1] = false;
+ }
+ m_positional[i] = false;
+ }
+
+ // all options following -- are positional
+ if (params[i] == "--")
+ break;
+ }
+}
+
+bool ParametersParser::has_option(const String& name) const
+{
+ assert(m_options.find(name) != m_options.end());
+ for (auto& param : m_params)
+ {
+ if (param[0] == '-' and param.substr(1_byte) == name)
+ return true;
+
+ if (param == "--")
+ break;
+ }
+ return false;
+}
+
+const String& ParametersParser::option_value(const String& name) const
+{
+ auto it = m_options.find(name);
+ assert(it != m_options.end());
+ assert(it->second == true);
+
+ for (size_t i = 0; i < m_params.size(); ++i)
+ {
+ if (m_params[i][0] == '-' and m_params[i].substr(1_byte) == name)
+ return m_params[i+1];
+
+ if (m_params[i] == "--")
+ break;
+ }
+ static String empty;
+ return empty;
+}
+
+size_t ParametersParser::positional_count() const
+{
+ size_t res = 0;
+ for (bool positional : m_positional)
+ {
+ if (positional)
+ ++res;
+ }
+ return res;
+}
+
+const String& ParametersParser::operator[] (size_t index) const
+{
+ assert(index < positional_count());
+ iterator it = begin();
+ while (index)
+ {
+ ++it;
+ --index;
+ }
+ return *it;
+}
+
+ParametersParser::iterator ParametersParser::begin() const
+{
+ int index = 0;
+ while (index < m_positional.size() and not m_positional[index])
+ ++index;
+ return iterator(*this, index);
+}
+
+ParametersParser::iterator ParametersParser::end() const
+{
+ return iterator(*this, m_params.size());
+}
+
+}