Console: Refactor argument parsing into iterator
[senf.git] / Console / Node.ct
index 0a5a9c0..ddf17ac 100644 (file)
 
 template <class ForwardRange>
 prefix_ senf::console::GenericNode &
-senf::console::DirectoryNode::traverse(ForwardRange const & range)
+senf::console::DirectoryNode::traverse(ForwardRange const & range, bool autocomplete)
 {
     typedef typename boost::range_const_iterator<ForwardRange>::type const_iterator;
     DirectoryNode::ptr dir (thisptr());
     const_iterator i (boost::begin(range));
     const_iterator const i_end (boost::end(range));
-    if (i != i_end && i->empty()) {
+    if (i != i_end && *i == std::string("")) {
         dir = root().thisptr();
         ++ i;
     }
     while (i != i_end) {
         const_iterator next_i (i);
         ++ next_i;
-        if (*i == "..") {
+        if (*i == std::string("..")) {
             dir = dir->parent();
             if (! dir)
                 dir = root().thisptr();
         }
-        else if (! i->empty()  && *i != ".") {
+        else if (*i != std::string("") && *i != std::string(".")) {
+            std::string name (*i);
+            if (! dir->hasChild(name) && autocomplete) {
+                ChildrenRange completions (dir->completions(name));
+                if (completions.size() == 1)
+                    name = completions.begin()->first;
+            }
             if (next_i == i_end)
-                return dir->get(*i);
+                return dir->get(name);
             else {
                 // Why does g++ give an error on this line ???? :
-                // dir = dynamic_cast<DirectoryNode&>( dir->get(*i) ).thisptr();
-                DirectoryNode & d (dynamic_cast<DirectoryNode&>( dir->get(*i) ));
+                // dir = dynamic_cast<DirectoryNode&>( dir->get(name) ).thisptr();
+                DirectoryNode & d (dynamic_cast<DirectoryNode&>( dir->get(name) ));
                 dir = d.thisptr();
             }
         }