Reformat detailed member documentation
[senf.git] / Console / Executor.cc
index 517c46c..4d9b2f9 100644 (file)
@@ -46,8 +46,8 @@ namespace {
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::Executor
 
-prefix_ void senf::console::Executor::operator()(ParseCommandInfo const & command,
-                                                 std::ostream & output)
+prefix_ void senf::console::Executor::execute(std::ostream & output,
+                                              ParseCommandInfo const & command)
 {
     SENF_LOG(( "Executing: " << command ));
 
@@ -56,9 +56,20 @@ prefix_ void senf::console::Executor::operator()(ParseCommandInfo const & comman
 
     try {
         switch(command.builtin()) {
-        case ParseCommandInfo::NoBuiltin :
-            traverseCommand(command.commandPath())(output, command.arguments());
+        case ParseCommandInfo::NoBuiltin : {
+            GenericNode & node ( traverseCommand(command.commandPath()) );
+            DirectoryNode * dir ( dynamic_cast<DirectoryNode*>(&node) );
+            if ( dir ) {
+                if (autocd_ && command.arguments().empty()) {
+                    oldCwd_ = cwd_;
+                    cwd_ = dir->thisptr();
+                } else
+                    throw InvalidCommandException();
+            } else {
+                dynamic_cast<CommandNode &>(node)(output, command);
+            }
             break;
+        }
 
         case ParseCommandInfo::BuiltinCD :
             if ( command.arguments() ) {
@@ -136,7 +147,8 @@ senf::console::Executor::traverseNode(ParseCommandInfo::argument_value_type cons
         return cwd().traverse(
             boost::make_iterator_range(
                 boost::make_transform_iterator(path.begin(), TraverseTokens()),
-                boost::make_transform_iterator(path.end(), TraverseTokens())));
+                boost::make_transform_iterator(path.end(), TraverseTokens())),
+            autocomplete_);
     }
     catch (std::bad_cast &) {
         throw InvalidPathException();
@@ -146,34 +158,34 @@ senf::console::Executor::traverseNode(ParseCommandInfo::argument_value_type cons
     }
 }
 
-prefix_ senf::console::DirectoryNode &
-senf::console::Executor::traverseDirectory(ParseCommandInfo::argument_value_type const & path)
+prefix_ senf::console::GenericNode &
+senf::console::Executor::traverseCommand(ParseCommandInfo::CommandPathRange const & path)
 {
     try {
-        return dynamic_cast<DirectoryNode&>( traverseNode(path) );
+        return cwd().traverse(path, autocomplete_);
     }
     catch (std::bad_cast &) {
-        throw InvalidDirectoryException();
+        throw InvalidPathException();
     }
-    catch (InvalidPathException &) {
-        throw InvalidDirectoryException();
+    catch (UnknownNodeNameException &) {
+        throw InvalidPathException();
     }
 }
 
-prefix_ senf::console::CommandNode &
-senf::console::Executor::traverseCommand(ParseCommandInfo::CommandPathRange const & path)
+prefix_ senf::console::DirectoryNode &
+senf::console::Executor::traverseDirectory(ParseCommandInfo::argument_value_type const & path)
 {
     try {
-        return dynamic_cast<CommandNode &>( cwd().traverse(path) );
+        return dynamic_cast<DirectoryNode&>( traverseNode(path) );
     }
     catch (std::bad_cast &) {
-        throw InvalidCommandException();
+        throw InvalidDirectoryException();
+    }
+    catch (InvalidPathException &) {
+        throw InvalidDirectoryException();
     }
-    catch (UnknownNodeNameException &) {
-        throw InvalidCommandException();
-    }        
 }
-        
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "Executor.mpp"