#include <boost/range/iterator_range.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/type_traits/remove_reference.hpp>
+#include <boost/any.hpp>
#include "../../Utils/Exception.hh"
#include "../../Utils/mpl.hh"
#include "../../Utils/Logger/SenfLog.hh"
class CommandNode;
DirectoryNode & root();
+ void dump(std::ostream & os, DirectoryNode & dir=root());
/** \brief Config/console node tree base-class
bool active() const; ///< \c true, if node is attached to the root() node
- void help(std::ostream & output) const; /// Write help info to \a output
+ void help(std::ostream & output) const; ///< Write help info to \a output
+ std::string shorthelp() const; ///< Get short (one-line) documentation
ptr thisptr(); ///< Get smart pointer to node
cptr thisptr() const; ///< Get smart pointer to node (const)
#endif
virtual void v_help(std::ostream & output) const = 0;
///< Provide help information
- /**< This member must be implemented in derived classes
- to provide node specific help information. */
+ /**< This member must be implemented in derived classes to
+ provide node specific help information. */
+ virtual std::string v_shorthelp() const = 0;
+ ///< Provide short documentation
+ /**< This member must be implemented in derived classes to
+ provide node specific documentation. */
private:
std::string name_;
explicit LinkNode(GenericNode & node);
virtual void v_help(std::ostream &) const;
+ virtual std::string v_shorthelp() const;
GenericNode::ptr node_;
};
static ptr create(); ///< Create node object.
/**< You should normally use either mkdir() or
ScopedDirectory instead of create() */
+ ~DirectoryNode();
///\}
///////////////////////////////////////////////////////////////////////////
DirectoryNode & mkdir(std::string const & name);
///< Create sub-directory node
+ DirectoryNode & provideDirectory(std::string const & name);
+ ///< Return subdirectory, possibly creating it
ChildrenRange children() const; ///< Return iterator range over all children.
/**< The returned range is sorted by child name. */
///////////////////////////////////////////////////////////////////////////
DirectoryNode & doc(std::string const & doc); ///< Set node documentation
+ DirectoryNode & shortdoc(std::string const & doc); ///< Set node short documentation
ptr thisptr();
cptr thisptr() const;
private:
void add(GenericNode::ptr node);
virtual void v_help(std::ostream & output) const;
+ virtual std::string v_shorthelp() const;
ChildMap children_;
std::string doc_;
+ std::string shortdoc_;
friend DirectoryNode & root();
};
void execute(std::ostream & output, ParseCommandInfo const & command) const;
///< Execute the command
- /**< Same as operator()()
+ /**< \param[in] output stream where result messages may be
+ written to
+ \param[in] arguments command arguments. This is a
+ range of ranges of Token instances. */
+
+ void execute(boost::any & rv, std::ostream & output, ParseCommandInfo const & command)
+ const;
+ ///< Execute the command
+ /**< \param[out] rv command return value
\param[in] output stream where result messages may be
written to
\param[in] arguments command arguments. This is a
written to
\param[in] arguments command arguments. This is a
range of ranges of Token instances. */
+ void operator()(boost::any & rv, std::ostream & output, ParseCommandInfo const & command)
+ const;
ptr thisptr();
cptr thisptr() const;
#ifndef DOXYGEN
private:
#endif
- virtual void v_execute(std::ostream & output, ParseCommandInfo const & command) const = 0;
+ virtual void v_execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command)
+ const = 0;
///< Called to execute the command
- /**< \param[in] output stream where result messages may be
- written to
+ /**< \param[out] rv return value holder
\param[in] arguments command arguments. This is a
range of ranges of Token instances. */
cptr thisptr() const;
SimpleCommandNode & doc(std::string const & doc);
+ SimpleCommandNode & shortdoc(std::string const & doc);
protected:
SimpleCommandNode(Function const & fn);
private:
virtual void v_help(std::ostream & output) const;
- virtual void v_execute(std::ostream & output, ParseCommandInfo const & command) const;
+ virtual std::string v_shorthelp() const;
+ virtual void v_execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command)
+ const;
Function fn_;
std::string doc_;
+ std::string shortdoc_;
};
#ifndef DOXYGEN
SimpleCommandNode & senf_console_add_node(DirectoryNode & node, std::string const & name,
SimpleCommandNode::Function fn, int);
+ DirectoryNode & senf_console_add_node(DirectoryNode & node, std::string const & name,
+ DirectoryNode & dir, int);
+
#endif
}}