Skip to content
Snippets Groups Projects
Commit 69cf6294 authored by g0dil's avatar g0dil
Browse files

Utils/Console: Add basic short-help info

parent 04c6d4d1
No related branches found
No related tags found
No related merge requests found
...@@ -95,10 +95,15 @@ prefix_ bool senf::console::GenericNode::isChildOf(DirectoryNode & parent) ...@@ -95,10 +95,15 @@ prefix_ bool senf::console::GenericNode::isChildOf(DirectoryNode & parent)
prefix_ void senf::console::LinkNode::v_help(std::ostream & os) prefix_ void senf::console::LinkNode::v_help(std::ostream & os)
const const
{ {
os << "link to ";
follow().help(os); follow().help(os);
} }
prefix_ std::string senf::console::LinkNode::v_shorthelp()
const
{
return follow().shorthelp();
}
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
//senf::console::DirectoryNode //senf::console::DirectoryNode
...@@ -161,6 +166,14 @@ prefix_ void senf::console::DirectoryNode::v_help(std::ostream & output) ...@@ -161,6 +166,14 @@ prefix_ void senf::console::DirectoryNode::v_help(std::ostream & output)
output << doc_ << "\n"; 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 // senf::console::detail::NodeTraverser
...@@ -217,6 +230,14 @@ prefix_ void senf::console::SimpleCommandNode::v_help(std::ostream & output) ...@@ -217,6 +230,14 @@ prefix_ void senf::console::SimpleCommandNode::v_help(std::ostream & output)
output << doc_ << "\n"; 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, prefix_ void senf::console::SimpleCommandNode::v_execute(boost::any & rv, std::ostream & os,
ParseCommandInfo const & command) ParseCommandInfo const & command)
const const
......
...@@ -84,6 +84,12 @@ prefix_ void senf::console::GenericNode::help(std::ostream & output) ...@@ -84,6 +84,12 @@ prefix_ void senf::console::GenericNode::help(std::ostream & output)
v_help(output); v_help(output);
} }
prefix_ std::string senf::console::GenericNode::shorthelp()
const
{
return v_shorthelp();
}
prefix_ bool senf::console::GenericNode::operator==(GenericNode & other) prefix_ bool senf::console::GenericNode::operator==(GenericNode & other)
const const
{ {
...@@ -247,6 +253,13 @@ senf::console::DirectoryNode::doc(std::string const & doc) ...@@ -247,6 +253,13 @@ senf::console::DirectoryNode::doc(std::string const & doc)
return *this; return *this;
} }
prefix_ senf::console::DirectoryNode &
senf::console::DirectoryNode::shortdoc(std::string const & doc)
{
shortdoc_ = doc;
return *this;
}
prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::thisptr() prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::thisptr()
{ {
return boost::static_pointer_cast<DirectoryNode>(shared_from_this()); return boost::static_pointer_cast<DirectoryNode>(shared_from_this());
...@@ -334,6 +347,13 @@ senf::console::SimpleCommandNode::doc(std::string const & doc) ...@@ -334,6 +347,13 @@ senf::console::SimpleCommandNode::doc(std::string const & doc)
return *this; return *this;
} }
prefix_ senf::console::SimpleCommandNode &
senf::console::SimpleCommandNode::shortdoc(std::string const & doc)
{
shortdoc_ = doc;
return *this;
}
prefix_ senf::console::SimpleCommandNode::ptr senf::console::SimpleCommandNode::thisptr() prefix_ senf::console::SimpleCommandNode::ptr senf::console::SimpleCommandNode::thisptr()
{ {
return boost::static_pointer_cast<SimpleCommandNode>(shared_from_this()); return boost::static_pointer_cast<SimpleCommandNode>(shared_from_this());
......
...@@ -279,6 +279,7 @@ namespace console { ...@@ -279,6 +279,7 @@ namespace console {
bool active() const; ///< \c true, if node is attached to the root() node 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 ptr thisptr(); ///< Get smart pointer to node
cptr thisptr() const; ///< Get smart pointer to node (const) cptr thisptr() const; ///< Get smart pointer to node (const)
...@@ -312,8 +313,12 @@ namespace console { ...@@ -312,8 +313,12 @@ namespace console {
#endif #endif
virtual void v_help(std::ostream & output) const = 0; virtual void v_help(std::ostream & output) const = 0;
///< Provide help information ///< Provide help information
/**< This member must be implemented in derived classes /**< This member must be implemented in derived classes to
to provide node specific help information. */ 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: private:
std::string name_; std::string name_;
...@@ -359,6 +364,7 @@ namespace console { ...@@ -359,6 +364,7 @@ namespace console {
explicit LinkNode(GenericNode & node); explicit LinkNode(GenericNode & node);
virtual void v_help(std::ostream &) const; virtual void v_help(std::ostream &) const;
virtual std::string v_shorthelp() const;
GenericNode::ptr node_; GenericNode::ptr node_;
}; };
...@@ -556,6 +562,7 @@ namespace console { ...@@ -556,6 +562,7 @@ namespace console {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
DirectoryNode & doc(std::string const & doc); ///< Set node documentation DirectoryNode & doc(std::string const & doc); ///< Set node documentation
DirectoryNode & shortdoc(std::string const & doc); ///< Set node short documentation
ptr thisptr(); ptr thisptr();
cptr thisptr() const; cptr thisptr() const;
...@@ -566,9 +573,11 @@ namespace console { ...@@ -566,9 +573,11 @@ namespace console {
private: private:
void add(GenericNode::ptr node); void add(GenericNode::ptr node);
virtual void v_help(std::ostream & output) const; virtual void v_help(std::ostream & output) const;
virtual std::string v_shorthelp() const;
ChildMap children_; ChildMap children_;
std::string doc_; std::string doc_;
std::string shortdoc_;
friend DirectoryNode & root(); friend DirectoryNode & root();
}; };
...@@ -694,18 +703,21 @@ namespace console { ...@@ -694,18 +703,21 @@ namespace console {
cptr thisptr() const; cptr thisptr() const;
SimpleCommandNode & doc(std::string const & doc); SimpleCommandNode & doc(std::string const & doc);
SimpleCommandNode & shortdoc(std::string const & doc);
protected: protected:
SimpleCommandNode(Function const & fn); SimpleCommandNode(Function const & fn);
private: private:
virtual void v_help(std::ostream & output) const; virtual void v_help(std::ostream & output) const;
virtual std::string v_shorthelp() const;
virtual void v_execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command) virtual void v_execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command)
const; const;
Function fn_; Function fn_;
std::string doc_; std::string doc_;
std::string shortdoc_;
}; };
#ifndef DOXYGEN #ifndef DOXYGEN
......
...@@ -107,10 +107,15 @@ BOOST_AUTO_UNIT_TEST(directoryNode) ...@@ -107,10 +107,15 @@ BOOST_AUTO_UNIT_TEST(directoryNode)
completions, completions,
completions+sizeof(completions)/sizeof(completions[0]) ); completions+sizeof(completions)/sizeof(completions[0]) );
p->doc("test doc"); p->doc("test doc\nline 2");
std::stringstream ss; std::stringstream ss;
p->help(ss); p->help(ss);
BOOST_CHECK_EQUAL( ss.str(), "test doc\n" ); BOOST_CHECK_EQUAL( ss.str(), "test doc\nline 2\n" );
BOOST_CHECK_EQUAL( p->shorthelp(), "test doc" );
p->doc("");
BOOST_CHECK_EQUAL( p->shorthelp(), "" );
p->shortdoc("short doc");
BOOST_CHECK_EQUAL( p->shorthelp(), "short doc" );
BOOST_CHECK( senf::console::root().remove("dir1") == p ); BOOST_CHECK( senf::console::root().remove("dir1") == p );
senf::console::root().remove("dir2"); senf::console::root().remove("dir2");
......
...@@ -155,6 +155,14 @@ prefix_ void senf::console::OverloadedCommandNode::v_help(std::ostream & os) ...@@ -155,6 +155,14 @@ prefix_ void senf::console::OverloadedCommandNode::v_help(std::ostream & os)
} }
} }
prefix_ std::string senf::console::OverloadedCommandNode::v_shorthelp()
const
{
if (!shortdoc_.empty())
return shortdoc_;
return doc_.substr(0,doc_.find('\n'));
}
prefix_ void senf::console::OverloadedCommandNode::v_execute(boost::any & rv, prefix_ void senf::console::OverloadedCommandNode::v_execute(boost::any & rv,
std::ostream & os, std::ostream & os,
ParseCommandInfo const & command) ParseCommandInfo const & command)
......
...@@ -56,6 +56,13 @@ senf::console::OverloadedCommandNode::doc(std::string const & doc) ...@@ -56,6 +56,13 @@ senf::console::OverloadedCommandNode::doc(std::string const & doc)
return *this; return *this;
} }
prefix_ senf::console::OverloadedCommandNode &
senf::console::OverloadedCommandNode::shortdoc(std::string const & doc)
{
shortdoc_ = doc;
return *this;
}
prefix_ unsigned prefix_ unsigned
senf::console::OverloadedCommandNode::overloadIndex(CommandOverload const & overload) senf::console::OverloadedCommandNode::overloadIndex(CommandOverload const & overload)
{ {
......
...@@ -184,6 +184,8 @@ namespace console { ...@@ -184,6 +184,8 @@ namespace console {
OverloadedCommandNode & doc(std::string const & doc); OverloadedCommandNode & doc(std::string const & doc);
///< Assign global help for all overloads ///< Assign global help for all overloads
OverloadedCommandNode & shortdoc(std::string const & doc);
///< Assign short documentation for all overloads
unsigned overloadIndex(CommandOverload const & overload); unsigned overloadIndex(CommandOverload const & overload);
///< Return the overload index for \a overload ///< Return the overload index for \a overload
...@@ -197,6 +199,7 @@ namespace console { ...@@ -197,6 +199,7 @@ namespace console {
OverloadedCommandNode(); OverloadedCommandNode();
virtual void v_help(std::ostream & output) const; virtual void v_help(std::ostream & output) const;
virtual std::string v_shorthelp() const;
virtual void v_execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command) virtual void v_execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command)
const; const;
...@@ -204,6 +207,7 @@ namespace console { ...@@ -204,6 +207,7 @@ namespace console {
Overloads overloads_; Overloads overloads_;
std::string doc_; std::string doc_;
std::string shortdoc_;
}; };
/** \brief Basic command overload /** \brief Basic command overload
......
...@@ -120,6 +120,12 @@ prefix_ void senf::console::ParsedCommandAttributorBase::nodeDoc(std::string con ...@@ -120,6 +120,12 @@ prefix_ void senf::console::ParsedCommandAttributorBase::nodeDoc(std::string con
node().doc(doc); node().doc(doc);
} }
prefix_ void senf::console::ParsedCommandAttributorBase::shortDoc(std::string const & doc)
const
{
node().shortdoc(doc);
}
///////////////////////////////cci.e/////////////////////////////////////// ///////////////////////////////cci.e///////////////////////////////////////
#undef prefix_ #undef prefix_
......
...@@ -102,6 +102,15 @@ senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::doc(std:: ...@@ -102,6 +102,15 @@ senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::doc(std::
return static_cast<Self const &>(*this); return static_cast<Self const &>(*this);
} }
template <class Overload, class Self, class ReturnType>
prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
shortdoc(std::string const & doc)
const
{
this->ParsedCommandAttributorBase::shortDoc(doc);
return static_cast<Self const &>(*this);
}
template <class Overload, class Self, class ReturnType> template <class Overload, class Self, class ReturnType>
prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>:: prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
overloadDoc(std::string const & doc) overloadDoc(std::string const & doc)
...@@ -136,6 +145,15 @@ senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::doc(std::string ...@@ -136,6 +145,15 @@ senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::doc(std::string
return static_cast<Self const &>(*this); return static_cast<Self const &>(*this);
} }
template <class Overload, class Self>
prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
shortdoc(std::string const & doc)
const
{
this->ParsedCommandAttributorBase::shortDoc(doc);
return static_cast<Self const &>(*this);
}
template <class Overload, class Self> template <class Overload, class Self>
prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,void>:: prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
overloadDoc(std::string const & doc) overloadDoc(std::string const & doc)
......
...@@ -216,6 +216,7 @@ namespace console { ...@@ -216,6 +216,7 @@ namespace console {
ParsedCommandOverloadBase & overload() const; ParsedCommandOverloadBase & overload() const;
void overloadDoc(std::string const & doc) const; void overloadDoc(std::string const & doc) const;
void nodeDoc(std::string const & doc) const; void nodeDoc(std::string const & doc) const;
void shortDoc(std::string const & doc) const;
private: private:
ParsedCommandOverloadBase & overload_; ParsedCommandOverloadBase & overload_;
...@@ -398,6 +399,7 @@ namespace console { ...@@ -398,6 +399,7 @@ namespace console {
{ {
public: public:
Self doc(std::string const & doc) const; ///< Set documentation for all overloads Self doc(std::string const & doc) const; ///< Set documentation for all overloads
Self shortdoc(std::string const & doc) const; ///< Set short documentation for all overloads
Self overloadDoc(std::string const & doc) const; ///< Set overload specific documentation Self overloadDoc(std::string const & doc) const; ///< Set overload specific documentation
Self formatter(typename Overload::Formatter formatter) const; Self formatter(typename Overload::Formatter formatter) const;
///< Set return value formatter ///< Set return value formatter
...@@ -426,6 +428,7 @@ namespace console { ...@@ -426,6 +428,7 @@ namespace console {
{ {
public: public:
Self doc(std::string const & doc) const; ///< Set documentation for all overloads Self doc(std::string const & doc) const; ///< Set documentation for all overloads
Self shortdoc(std::string const & doc) const; ///< Set short documentation for all overloads
Self overloadDoc(std::string const & doc) const; ///< Set overload specific documentation Self overloadDoc(std::string const & doc) const; ///< Set overload specific documentation
protected: protected:
......
...@@ -165,6 +165,9 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) ...@@ -165,6 +165,9 @@ BOOST_AUTO_UNIT_TEST(parsedCommand)
"lux sto ioco. Per Re dono. Copiose reus scitus jus diligens sis scapulare\n" "lux sto ioco. Per Re dono. Copiose reus scitus jus diligens sis scapulare\n"
"Servitium transi." ) "Servitium transi." )
.shortdoc(
"Ops fortunate." )
.overloadDoc( .overloadDoc(
"Lo nam balnearius Opprimo Pennatus, no decentia sui, dicto esse se pulchritudo,\n" "Lo nam balnearius Opprimo Pennatus, no decentia sui, dicto esse se pulchritudo,\n"
"pupa Sive res indifferenter. Captivo pa." ) "pupa Sive res indifferenter. Captivo pa." )
...@@ -201,6 +204,8 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) ...@@ -201,6 +204,8 @@ BOOST_AUTO_UNIT_TEST(parsedCommand)
boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) ); boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )) );
BOOST_CHECK_EQUAL( ss.str(), "333\n" "224\n" "Value: foo\n" "Value: \n" ); BOOST_CHECK_EQUAL( ss.str(), "333\n" "224\n" "Value: foo\n" "Value: \n" );
BOOST_CHECK_EQUAL( dir("cb").shorthelp(), "Ops fortunate." );
} }
{ {
......
...@@ -78,6 +78,14 @@ senf::console::ConstVariableAttributor<Variable>::doc(std::string const & doc) ...@@ -78,6 +78,14 @@ senf::console::ConstVariableAttributor<Variable>::doc(std::string const & doc)
return *this; return *this;
} }
template <class Variable>
prefix_ senf::console::ConstVariableAttributor<Variable>
senf::console::ConstVariableAttributor<Variable>::shortdoc(std::string const & doc)
{
queryOverload_.node().shortdoc(doc);
return *this;
}
template <class Variable> template <class Variable>
prefix_ senf::console::ConstVariableAttributor<Variable> prefix_ senf::console::ConstVariableAttributor<Variable>
senf::console::ConstVariableAttributor<Variable>::formatter(Formatter formatter) senf::console::ConstVariableAttributor<Variable>::formatter(Formatter formatter)
...@@ -144,6 +152,14 @@ senf::console::VariableAttributor<Variable>::doc(std::string const & doc) ...@@ -144,6 +152,14 @@ senf::console::VariableAttributor<Variable>::doc(std::string const & doc)
return *this; return *this;
} }
template <class Variable>
prefix_ typename senf::console::VariableAttributor<Variable>
senf::console::VariableAttributor<Variable>::shortdoc(std::string const & doc)
{
ConstVariableAttributor<Variable>::shortdoc(doc);
return *this;
}
template <class Variable> template <class Variable>
prefix_ typename senf::console::VariableAttributor<Variable> prefix_ typename senf::console::VariableAttributor<Variable>
senf::console::VariableAttributor<Variable>::formatter(Formatter formatter) senf::console::VariableAttributor<Variable>::formatter(Formatter formatter)
......
...@@ -86,6 +86,7 @@ namespace console { ...@@ -86,6 +86,7 @@ namespace console {
typedef ConstVariableAttributor return_type; typedef ConstVariableAttributor return_type;
ConstVariableAttributor doc(std::string const & doc); ConstVariableAttributor doc(std::string const & doc);
ConstVariableAttributor shortdoc(std::string const & doc);
ConstVariableAttributor formatter(Formatter formatter); ConstVariableAttributor formatter(Formatter formatter);
OverloadedCommandNode & node() const; ///< Return the node object OverloadedCommandNode & node() const; ///< Return the node object
...@@ -145,6 +146,7 @@ namespace console { ...@@ -145,6 +146,7 @@ namespace console {
typedef typename ConstVariableAttributor<Variable>::QueryOverload QueryOverload; typedef typename ConstVariableAttributor<Variable>::QueryOverload QueryOverload;
VariableAttributor doc(std::string const & doc); ///< Set documentation of the variable VariableAttributor doc(std::string const & doc); ///< Set documentation of the variable
VariableAttributor shortdoc(std::string const & doc); ///< Set short documentation
VariableAttributor formatter(Formatter formatter); ///< Set formatter VariableAttributor formatter(Formatter formatter); ///< Set formatter
/**< The \a formatter must be a callable with a signature /**< The \a formatter must be a callable with a signature
compatible with compatible with
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment