Packets: Add StringParser ostream operation
[senf.git] / Utils / Console / Node.cc
index 41c1779..69e1bfb 100644 (file)
@@ -39,6 +39,31 @@ prefix_ senf::console::DirectoryNode & senf::console::root()
     return *rootNode;
 }
 
+namespace {
+    void dodump(std::ostream & output, unsigned level, senf::console::DirectoryNode & node)
+    {
+        std::string pad (2*level, ' ');
+        senf::console::DirectoryNode::child_iterator i (node.children().begin());
+        senf::console::DirectoryNode::child_iterator const i_end (node.children().end());
+        for (; i != i_end; ++i) {
+            output << pad << i->first;
+            if (i->second->isDirectory()) {
+                output << "/\n";
+                dodump(output, level+1,static_cast<senf::console::DirectoryNode&>(*i->second));
+            }
+            else if (i->second->isLink()) 
+                output << "@ -> " << i->second->followLink().path() << '\n';
+            else
+                output << '\n';
+        }
+    }
+}
+
+prefix_ void senf::console::dump(std::ostream & os, DirectoryNode & dir)
+{
+    dodump(os,0,dir);
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::GenericNode
 
@@ -95,10 +120,15 @@ prefix_ bool senf::console::GenericNode::isChildOf(DirectoryNode & parent)
 prefix_ void senf::console::LinkNode::v_help(std::ostream & os)
     const
 {
-    os << "link to ";
     follow().help(os);
 }
 
+prefix_ std::string senf::console::LinkNode::v_shorthelp()
+    const
+{
+    return follow().shorthelp();
+}
+
 ///////////////////////////////////////////////////////////////////////////
 //senf::console::DirectoryNode
 
@@ -161,6 +191,14 @@ prefix_ void senf::console::DirectoryNode::v_help(std::ostream & output)
     output << doc_ << "\n";
 }
 
+prefix_ std::string senf::console::DirectoryNode::v_shorthelp()
+    const
+{
+    if (! shortdoc_.empty())
+        return shortdoc_;
+    return doc_.substr(0,doc_.find('\n'));
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::detail::NodeTraverser
 
@@ -217,6 +255,14 @@ prefix_ void senf::console::SimpleCommandNode::v_help(std::ostream & output)
     output << doc_ << "\n";
 }
 
+prefix_ std::string senf::console::SimpleCommandNode::v_shorthelp()
+    const
+{
+    if (! shortdoc_.empty())
+        return shortdoc_;
+    return doc_.substr(0,doc_.find('\n'));
+}
+
 prefix_ void senf::console::SimpleCommandNode::v_execute(boost::any & rv, std::ostream & os,
                                                          ParseCommandInfo const & command)
     const