Console: Implement custom return-value formatter support
[senf.git] / Console / ParsedCommand.cti
index e37906c..029fa2d 100644 (file)
@@ -28,7 +28,7 @@
 // Custom includes
 #include "../Utils/membind.hh"
 #include <boost/format.hpp>
-#include <boost/parameter/binding.hpp>
+#include "../Utils/parameter.hh"
 
 #define prefix_ inline
 ///////////////////////////////cti.p///////////////////////////////////////
@@ -99,6 +99,13 @@ prefix_ void senf::console::ParsedCommandAttributorBase::defaultValue(Type const
     overload().arg(index_).hasDefault = true;
 }
 
+template <class Type, class Fn>
+prefix_ void senf::console::ParsedCommandAttributorBase::parser(Fn fn)
+    const
+{
+    overload().arg<Type>(index_).parser = fn;
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::ParsedCommandAttributor<Overload>
 
@@ -119,9 +126,43 @@ senf::console::ParsedCommandAttributor<Overload>::ParsedCommandAttributor(Overlo
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::ParsedArgumentAttributorBase<Overload,Self>
 
+template <class Overload, class Self, class ReturnType>
+prefix_ Self
+senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::doc(std::string const & doc)
+    const
+{
+    this->ParsedCommandAttributorBase::nodeDoc(doc);
+    return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self, class ReturnType>
+prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
+overloadDoc(std::string const & doc)
+    const
+{
+    this->ParsedCommandAttributorBase::overloadDoc(doc);
+    return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self, class ReturnType>
+prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
+formatter(typename Overload::Formatter f)
+    const
+{
+    this->overload().formatter(f);
+    return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self, class ReturnType>
+prefix_
+senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
+ParsedArgumentAttributorBase(Overload & overload, unsigned index)
+    : ParsedCommandAttributor<Overload> (overload, index)
+{}
+
 template <class Overload, class Self>
 prefix_ Self
-senf::console::ParsedArgumentAttributorBase<Overload,Self>::doc(std::string const & doc)
+senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::doc(std::string const & doc)
     const
 {
     this->ParsedCommandAttributorBase::nodeDoc(doc);
@@ -129,7 +170,7 @@ senf::console::ParsedArgumentAttributorBase<Overload,Self>::doc(std::string cons
 }
 
 template <class Overload, class Self>
-prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self>::
+prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
 overloadDoc(std::string const & doc)
     const
 {
@@ -139,7 +180,7 @@ overloadDoc(std::string const & doc)
 
 template <class Overload, class Self>
 prefix_
-senf::console::ParsedArgumentAttributorBase<Overload,Self>::
+senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
 ParsedArgumentAttributorBase(Overload & overload, unsigned index)
     : ParsedCommandAttributor<Overload> (overload, index)
 {}
@@ -162,12 +203,15 @@ senf::console::ParsedArgumentAttributor<Overload,index,flag>::
 argInfo(ArgumentPack const & args)
     const
 {
-#   define HaveArg(tag) boost::is_same< \
-        typename boost::parameter::binding<ArgumentPack, tag>::type, void >()
+#   define ProcessArg(tag) \
+        argInfo( kw:: tag, args, senf::has_parameter< ArgumentPack, kw::type:: tag >() )
 
-    argInfo( kw::name,          args, HaveArg(kw::type::name)          );
-    argInfo( kw::description,   args, HaveArg(kw::type::description)   );
-    argInfo( kw::default_value, args, HaveArg(kw::type::default_value) );
+    ProcessArg(name);
+    ProcessArg(description);
+    ProcessArg(default_value);
+    ProcessArg(type_name);
+    ProcessArg(default_doc);
+    ProcessArg(parser);
 
     return next();
 
@@ -177,7 +221,7 @@ argInfo(ArgumentPack const & args)
 template <class Overload, unsigned index, bool flag>
 template <class Kw, class ArgumentPack>
 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
-argInfo(Kw const &, ArgumentPack const &, boost::mpl::true_)
+argInfo(Kw const &, ArgumentPack const &, boost::mpl::false_)
     const
 {}
 
@@ -185,7 +229,7 @@ template <class Overload, unsigned index, bool flag>
 template <class ArgumentPack>
 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
 argInfo(boost::parameter::keyword<kw::type::name> const &, ArgumentPack const & args,
-        boost::mpl::false_)
+        boost::mpl::true_)
     const
 {
     this->argName(args[kw::name]);
@@ -195,7 +239,7 @@ template <class Overload, unsigned index, bool flag>
 template <class ArgumentPack>
 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
 argInfo(boost::parameter::keyword<kw::type::description> const &, ArgumentPack const & args,
-        boost::mpl::false_)
+        boost::mpl::true_)
     const
 {
     this->argDoc(args[kw::description]);
@@ -205,13 +249,44 @@ template <class Overload, unsigned index, bool flag>
 template <class ArgumentPack>
 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
 argInfo(boost::parameter::keyword<kw::type::default_value> const &, ArgumentPack const & args,
-        boost::mpl::false_)
+        boost::mpl::true_)
     const
 {
     this->defaultValue(args[kw::default_value]);
 }
 
 template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::type_name> const &, ArgumentPack const & args,
+        boost::mpl::true_)
+    const
+{
+    this->typeName(args[kw::type_name]);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::default_doc> const &, ArgumentPack const & args,
+        boost::mpl::true_)
+    const
+{
+    BOOST_STATIC_ASSERT(( senf::has_parameter<ArgumentPack, kw::type::default_value>::value ));
+    this->defaultDoc(args[kw::default_doc]);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::parser> const &, ArgumentPack const & args,
+        boost::mpl::true_)
+    const
+{
+    this->parser(args[kw::parser]);
+}
+
+template <class Overload, unsigned index, bool flag>
 prefix_
 senf::console::ParsedArgumentAttributor<Overload,index,flag>::
 ParsedArgumentAttributor(Overload & overload)
@@ -231,7 +306,15 @@ prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
 defaultValue(value_type const & value)
     const
 {
-    ParsedCommandAttributorBase::defaultValue<arg_type>(value);
+    ParsedCommandAttributorBase::defaultValue<value_type>(value);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class Fn>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::parser(Fn fn)
+    const
+{
+    ParsedCommandAttributorBase::parser<value_type>(fn);
 }
 
 ///////////////////////////////////////////////////////////////////////////
@@ -330,23 +413,6 @@ senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & n
                              senf::membind(fn,&owner)) ) );
 }
 
-///////////////////////////////////////////////////////////////////////////
-// senf::console::detail::CheckVoidReturn<Type>
-
-template <class Type>
-template <class Fn>
-prefix_ void senf::console::detail::CheckVoidReturn<Type>::call(Fn fn, std::ostream & os)
-{
-    ReturnValueTraits<Type>::format(fn(),os);
-    os << "\n";
-}
-
-template <class Fn>
-prefix_ void senf::console::detail::CheckVoidReturn<void>::call(Fn fn, std::ostream & os)
-{
-    fn();
-}
-
 ///////////////////////////////cti.e///////////////////////////////////////
 #undef prefix_