boost::prior(path.end())),
dir);
DirectoryNode & base (*dir.back().lock());
- std::string const & name (boost::prior(path.end())->value());
+ std::string const & name (complete(base, boost::prior(path.end())->value()));
if (policy_)
policy_( base, name );
return dir.back().lock()->get(name);
;
else {
DirectoryNode & base (*dir.back().lock());
+ std::string name (complete(base, i->value()));
if (policy_)
- policy_( base, i->value() );
- dir.push_back(base[i->value()].thisptr());
+ policy_( base, name );
+ dir.push_back(base[name].thisptr());
}
}
}
}
}
+prefix_ std::string senf::console::Executor::complete(DirectoryNode & dir,
+ std::string const & name)
+{
+ if (! dir.hasChild(name)) {
+ DirectoryNode::ChildrenRange completions (dir.completions(name));
+ if (completions.size() == 1)
+ return completions.begin()->first;
+ }
+ return name;
+}
+
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_
//#include "Executor.mpp"
GenericNode & traverseNode(ParseCommandInfo::TokensRange const & path);
void traverseDirectory(ParseCommandInfo::TokensRange const & path,
Path & dir);
+ std::string complete(DirectoryNode & dir, std::string const & name);
struct InvalidPathException {};
struct InvalidDirectoryException {};
senf::console::root().remove("dir2");
}
+BOOST_AUTO_UNIT_TEST(executorAuto)
+{
+ senf::console::root().mkdir("dir1").mkdir("dir3");
+ senf::console::root().mkdir("dir2").doc("Helptext").add("test",&testCommand);
+
+ senf::console::Executor executor;
+ executor
+ .autocomplete(true)
+ .autocd(true);
+ senf::console::CommandParser parser;
+
+ {
+ std::stringstream os;
+ parser.parse("dir2", &setCommand);
+ executor(os, commands.back());
+ BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
+ BOOST_CHECK_EQUAL( os.str(), "" );
+ }
+
+ {
+ std::stringstream os;
+ parser.parse("t", &setCommand);
+ executor(os, commands.back());
+ BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
+ }
+
+
+ commands.clear();
+ senf::console::root().remove("dir1");
+ senf::console::root().remove("dir2");
+}
+
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_