00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "OverloadedCommand.hh"
00027
00028
00029
00030
00031
00032 #define prefix_
00033
00034
00035
00036
00037
00038 prefix_ senf::console::OverloadedCommandNode &
00039 senf::console::OverloadedCommandNode::insertOverload(DirectoryNode & dir,
00040 std::string const & name,
00041 CommandOverload::ptr overload)
00042 {
00043 OverloadedCommandNode & node (
00044 dir.hasChild(name)
00045 ? dynamic_cast<OverloadedCommandNode &>(dir(name))
00046 : dir.add(name, OverloadedCommandNode::create()));
00047 node.add(overload);
00048 return node;
00049 }
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 prefix_ void senf::console::OverloadedCommandNode::v_help(std::ostream & os)
00084 const
00085 {
00086 typedef std::vector<ArgumentDoc> ArgumentDocs;
00087 ArgumentDocs argumentDocs;
00088 bool haveDocumentedArg (false);
00089
00090 os << "Usage:\n";
00091 {
00092 Overloads::const_iterator i (overloads_.begin());
00093 Overloads::const_iterator const i_end (overloads_.end());
00094 unsigned index (1);
00095 for (; i != i_end; ++i, ++index) {
00096 os << " ";
00097 if (overloads_.size() > 1) os << index << "- ";
00098 os << name();
00099 for (unsigned j (0); j < (*i)->numArguments(); ++j) {
00100 ArgumentDoc arg;
00101 (*i)->argumentDoc(j, arg);
00102
00103 os << ' ';
00104 if (! arg.defaultValue.empty())
00105 os << '[';
00106 if (! arg.name.empty()) os << arg.name;
00107 if (! arg.type.empty()) os << ':' << arg.type;
00108 if (arg.name.empty() && arg.type.empty()) os << "...";
00109 if (! arg.defaultValue.empty())
00110 os << ']';
00111
00112 if (! arg.name.empty() || ! arg.defaultValue.empty()) {
00113 ArgumentDocs::iterator k (argumentDocs.begin());
00114 ArgumentDocs::iterator const k_end (argumentDocs.end());
00115 for (; k != k_end; ++k)
00116 if (k->name == arg.name && k->defaultValue == arg.defaultValue) {
00117 if (! arg.doc.empty() && k->doc.empty()) {
00118 k->doc == arg.doc;
00119 haveDocumentedArg = true;
00120 }
00121 break;
00122 }
00123 if (k == k_end) {
00124 argumentDocs.push_back(arg);
00125 if (! arg.doc.empty())
00126 haveDocumentedArg = true;
00127 }
00128 }
00129 }
00130 os << '\n';
00131 }
00132 }
00133
00134 if (haveDocumentedArg) {
00135 os << "\n" "With:\n";
00136 ArgumentDocs::const_iterator i (argumentDocs.begin());
00137 ArgumentDocs::const_iterator const i_end (argumentDocs.end());
00138 for (; i != i_end; ++i) {
00139 if (! i->doc.empty() || ! i->defaultValue.empty()) {
00140 os << " "
00141 << i->name
00142 << std::string(i->name.length()<8 ? 8-i->name.length() : 0, ' ')
00143 << " "
00144 << i->doc
00145 << '\n';
00146 if (! i->defaultValue.empty())
00147 os << " default: " << i->defaultValue << '\n';
00148 }
00149 }
00150 }
00151
00152 if (! doc_.empty())
00153 os << "\n" << doc_ << "\n";
00154
00155 {
00156 Overloads::const_iterator i (overloads_.begin());
00157 Overloads::const_iterator const i_end (overloads_.end());
00158 unsigned index (1);
00159 for (; i != i_end; ++i, ++index) {
00160 std::string overloadDoc ((*i)->doc());
00161 if (! overloadDoc.empty()) {
00162 os << "\n";
00163 if (overloads_.size() > 1)
00164 os << "Variant " << index << ":\n";
00165 os << overloadDoc << "\n";
00166 }
00167 }
00168 }
00169 }
00170
00171 prefix_ std::string senf::console::OverloadedCommandNode::v_shorthelp()
00172 const
00173 {
00174 if (!shortdoc_.empty())
00175 return shortdoc_;
00176 if (!doc_.empty())
00177 return doc_.substr(0,doc_.find('\n'));
00178 Overloads::const_iterator i (overloads_.begin());
00179 Overloads::const_iterator const i_end (overloads_.end());
00180 for (; i != i_end; ++i) {
00181 std::string overloadDoc ((*i)->doc());
00182 if (! overloadDoc.empty())
00183 return overloadDoc.substr(0,overloadDoc.find('\n'));
00184 }
00185 return "";
00186 }
00187
00188 prefix_ void senf::console::OverloadedCommandNode::v_execute(boost::any & rv,
00189 std::ostream & os,
00190 ParseCommandInfo const & command)
00191 const
00192 {
00193 Overloads::const_iterator i (overloads_.begin());
00194 Overloads::const_iterator const i_end (overloads_.end());
00195 SyntaxErrorException err;
00196 for (; i != i_end; ++i) {
00197 try {
00198 (**i)(rv, os, command);
00199 return;
00200 }
00201 catch (SyntaxErrorException & ex) {
00202 err = ex;
00203 };
00204 }
00205 throw err;
00206 }
00207
00208
00209
00210
00211 prefix_ unsigned senf::console::SimpleCommandOverload::v_numArguments()
00212 const
00213 {
00214 return 1;
00215 }
00216
00217 prefix_ void senf::console::SimpleCommandOverload::v_argumentDoc(unsigned index, ArgumentDoc & doc)
00218 const
00219 {}
00220
00221 prefix_ std::string senf::console::SimpleCommandOverload::v_doc()
00222 const
00223 {
00224 return doc_;
00225 }
00226
00227 prefix_ void senf::console::SimpleCommandOverload::v_execute(boost::any & rv,
00228 std::ostream & os,
00229 ParseCommandInfo const & command)
00230 const
00231 {
00232 fn_(os, command);
00233 }
00234
00235
00236 #undef prefix_
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248