Console: Add console logging documentation
[senf.git] / Console / Node.cci
index 915d954..8fe2c2b 100644 (file)
@@ -52,11 +52,6 @@ prefix_ void senf::console::GenericNode::name(std::string const & name)
     name_ = name;
 }
 
-prefix_ void senf::console::GenericNode::name(GenericNode & node, std::string const & name)
-{
-    node.name_ = name;
-}
-
 prefix_ boost::shared_ptr<senf::console::DirectoryNode> senf::console::GenericNode::parent()
     const
 {
@@ -66,8 +61,10 @@ prefix_ boost::shared_ptr<senf::console::DirectoryNode> senf::console::GenericNo
 
 prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::unlink()
 {
-    SENF_ASSERT( parent() );
-    return parent()->remove(name());
+    if (parent_)
+        return parent()->remove(name());
+    else
+        return thisptr();
 }
 
 prefix_ void senf::console::GenericNode::help(std::ostream & output)
@@ -90,31 +87,56 @@ prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr()
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::DirectoryNode
 
-prefix_ std::auto_ptr<senf::console::DirectoryNode>
-senf::console::DirectoryNode::create()
+prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::create()
+{
+    return ptr(new DirectoryNode());
+}
+
+prefix_ bool senf::console::DirectoryNode::hasChild(std::string const & name)
+    const
 {
-    return std::auto_ptr<DirectoryNode>(new DirectoryNode());
+    ChildMap::const_iterator i (children_.find(name));
+    return i != children_.end();
+}
+
+prefix_ senf::console::DirectoryNode &
+senf::console::DirectoryNode::getDirectory(std::string const & name)
+    const
+{
+    try {
+        return dynamic_cast<DirectoryNode&>(get(name));
+    }
+    SENF_WRAP_EXC(std::bad_cast)
 }
 
 prefix_ senf::console::DirectoryNode &
 senf::console::DirectoryNode::operator[](std::string const & name)
     const
 {
-    return dynamic_cast<DirectoryNode&>(get(name));
+    return getDirectory(name);
+}
+
+prefix_ senf::console::CommandNode &
+senf::console::DirectoryNode::getCommand(std::string const & name)
+    const
+{
+    try {
+        return dynamic_cast<CommandNode&>(get(name));
+    }
+    SENF_WRAP_EXC(std::bad_cast)
 }
 
 prefix_ senf::console::CommandNode &
 senf::console::DirectoryNode::operator()(std::string const & name)
     const
 {
-    return dynamic_cast<CommandNode&>(get(name));
+    return getCommand(name);
 }
 
 prefix_ senf::console::DirectoryNode &
 senf::console::DirectoryNode::mkdir(std::string const & name)
 {
-    std::auto_ptr<DirectoryNode> node (create());
-    return add(name, node);
+    return add(name, create());
 }
 
 prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children()
@@ -123,6 +145,14 @@ prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode
     return boost::make_iterator_range(children_.begin(), children_.end());
 }
 
+prefix_ senf::console::DirectoryNode::ChildrenRange
+senf::console::DirectoryNode::completions(std::string const & s)
+    const
+{
+    return boost::make_iterator_range(children_.lower_bound(s),
+                                      children_.lower_bound(s + "\xff"));
+}
+
 prefix_ senf::console::DirectoryNode::DirectoryNode()
 {}
 
@@ -145,6 +175,23 @@ prefix_ senf::console::DirectoryNode::cptr senf::console::DirectoryNode::thisptr
 }
 
 ///////////////////////////////////////////////////////////////////////////
+// senf::console::SyntaxErrorException
+
+prefix_ senf::console::SyntaxErrorException::SyntaxErrorException(std::string const & msg)
+    : message_(msg)
+{}
+
+prefix_ senf::console::SyntaxErrorException::~SyntaxErrorException()
+    throw()
+{}
+
+prefix_ std::string const & senf::console::SyntaxErrorException::message()
+    const
+{
+    return message_;
+}
+
+///////////////////////////////////////////////////////////////////////////
 // senf::console::CommandNode
 
 prefix_ senf::console::CommandNode::ptr senf::console::CommandNode::thisptr()
@@ -161,23 +208,31 @@ prefix_ senf::console::CommandNode::cptr senf::console::CommandNode::thisptr()
 prefix_ senf::console::CommandNode::CommandNode()
 {}
 
-///////////////////////////////////////////////////////////////////////////
-// senf::console::SimpleCommandNode
+prefix_ void senf::console::CommandNode::execute(std::ostream & output,
+                                                 ParseCommandInfo const & command)
+    const
+{
+    v_execute(output, command);
+}
 
-prefix_ void senf::console::SimpleCommandNode::operator()(std::ostream & output,
-                                                          Arguments const & arguments)
+prefix_ void senf::console::CommandNode::operator()(std::ostream & output,
+                                                    ParseCommandInfo const & command)
+    const
 {
-    fn_(output, arguments);
+    execute(output, command);
 }
 
+///////////////////////////////////////////////////////////////////////////
+// senf::console::SimpleCommandNode
+
 prefix_ senf::console::SimpleCommandNode::SimpleCommandNode(Function const & fn)
     : fn_ (fn)
 {}
 
-prefix_ std::auto_ptr<senf::console::SimpleCommandNode>
+prefix_ senf::console::SimpleCommandNode::ptr
 senf::console::SimpleCommandNode::create(Function const & fn)
 {
-    return std::auto_ptr<SimpleCommandNode>(new SimpleCommandNode(fn));
+    return ptr(new SimpleCommandNode(fn));
 }
 
 prefix_ senf::console::SimpleCommandNode &
@@ -187,6 +242,25 @@ senf::console::SimpleCommandNode::doc(std::string const & doc)
     return *this;
 }
 
+prefix_ senf::console::SimpleCommandNode::ptr senf::console::SimpleCommandNode::thisptr()
+{
+    return boost::static_pointer_cast<SimpleCommandNode>(shared_from_this());
+}
+
+prefix_ senf::console::SimpleCommandNode::cptr senf::console::SimpleCommandNode::thisptr()
+    const
+{
+    return boost::static_pointer_cast<SimpleCommandNode const>(shared_from_this());
+}
+
+prefix_ senf::console::SimpleCommandNode &
+senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name,
+                                     SimpleCommandNode::Function fn, int)
+{
+    return node.add(name, SimpleCommandNode::create(fn));
+}
+
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_