Console: Documentation of the configuration support
[senf.git] / Console / Mainpage.dox
1 // $Id$
2 //
3 // Copyright (C) 2008 
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \mainpage The Configuration and Runtime Control Library
24
25     The Console library implements a runtime interactive (network) console which allows to
26     configure, control and manipulate a running application in any way. Additionally this library
27     provides support for configuration files and command line parsing which can be used with or
28     without the network console.
29
30     \autotoc
31
32     \section console_intro Introduction
33
34     There are three parts to the Config/console library:
35
36     The Config/Console library is built around several components
37
38     \li The \link node_tree Node tree\endlink represents all configuration options and commands
39         organized in a filesystem like structure.
40     \li \link console_commands Actions\endlink are added to the node tree in the form of command
41         nodes.
42     \li There exist several interfaces to \link console_access access\endlink entries in the node
43         tree: interactive console, reading configuration files etc.
44     
45     The node tree works like a directory structure. Commands are entered into this directory
46     structure and can be called passing arbitrary arguments. Configuration parameters are just
47     commands which set their respective parameter, however the library allows commands to do much
48     more than just that.
49
50     \section console_example Example
51
52     The following example shows a \e very short summary on how to integrate the config/console
53     library. See above links for more:
54
55     \code
56     #include <senf/Console.hh>
57
58     // Define callback function.
59     void mycommand(std::ostream & os, int foo, int bar)
60     {
61         // ...
62         os << "!! Important message ...\n";
63     }
64
65     namespace kw = senf::console::kw;
66
67     int main(int argc, char** argv)
68     {
69         // Provide global documentation
70         senf::console::root()
71             .doc("This is someServer server");
72
73         // Add a command
74         senf::console::root()
75             .add("mycommand", &mycommand)
76             .doc("If <bar> is given, flurgle the <foo>, otherwise burgle it")
77             .arg("foo")
78             .arg(kw::name = "bar", kw::default_value = 0);
79
80        // Parse command line parameters
81        senf::console::parseOptions(argc,argv);
82
83         // Start the interactive console server
84         senf::console::Server::start(senf::INet4SocketAddress(senf::INet4Address::None, 23232u))
85             .name("someServer");
86
87         // Run the scheduler
88        senf::Scheduler::instance().process();
89     }
90     \endcode
91
92     after this registration, we can call the command from the command-line using
93
94     <pre>
95     $ someServer --mycommand="1 2"
96     </pre>
97
98     the console can be accessed easily via telnet:
99     
100     <pre>
101     $ telnet localhost 23232
102     Trying 127.0.0.1...
103     Connected to localhost.
104     Escape character is '^]'
105     xxxx-xx-xx xx:xx:xx.xxxxxx-0000 [NOTICE][senf::console::Server] Registered new client 0xxxxxxx
106     someServer:/# ls
107     mycommand
108     someServer:/# mycommand
109     !! Important message  ...
110     someServer:/# exit
111     xxxx-xx-xx xx:xx:xx.xxxxxx-0000 [NOTICE][senf::console::Server] Disposing client 0xxxxxxx
112     Connection closed by foreign host.
113     $
114     </pre>
115
116     \see \ref console_testserver for a complete example application
117
118     \section intro_usage Access
119
120     There are several ways to access the node tree:
121     \li By parsing configuration files
122     \li By parsing command line parameters
123     \li By providing interactive console access
124
125     \see console_access
126
127     \section intro_nodes The node tree
128
129     The basic idea is, that the console/config library manages a directory structure of parameters
130     and auxiliary commands. Parameters are just commands which set a parameter value so everything
131     is either a directory entry (senf::console::DirectoryNode) or a command
132     (senf::console::CommandNode).
133     
134     \see \ref node_tree
135
136
137     \section intro_commands Registering console/config commands
138
139     The console/config language does not define, how arguments are passed to the commands, it just
140     tokenizes the input and passes the tokens to the commands which then handle the
141     conversion.
142
143     Since parsing the tokens into something usable is quite tedious and error prone, the library
144     implements automatic argument parsing where the argument tokens are automatically parsed
145     depending on argument types. This enables you to register a command taking an integer argument
146     which will be called with an already parsed integer value (or throw a
147     senf::console::SyntaxErrorException if the conversion fails). This will be the most often used
148     command.
149
150     \see \ref console_commands
151  */
152
153 /** \defgroup console_access Accessing the Console/Config tree
154
155     The Console/Config library provides several ways to use the node tree to configure and control
156     an application.
157
158     \autotoc
159
160     \section console_access_config Configuration support
161
162     The configuration support of the Console/Config library revolves around the ConfigSource
163     concept. Each ConfigSource will somehow provide commands which will then be executed against the
164     node tree.
165
166     To simplify the usage, there will always be three interfaces to a specific config source:
167     \li A constructor to build a bare config source which is then added to a
168         senf::console::ConfigBundle (see \ref console_access_multiple)
169     \li A class parsing and executing a single config source. The visible interface of this class is
170         a combination of the constructor and the senf::console::ConfigBundle interfaces.
171     \li A helper function which will do the complete parsing of a single source with default
172         parameters.
173
174     When parsing these configuration sources, it is always possible to optionally change the root
175     node used during parsing and it is also possible to restrict parsing to a command subset. See
176     \ref console_access_partial.
177
178     \subsection console_access_file Configuration files
179
180     <table class="senf fixedwidth">
181     <tr><td><b>Constructor</b></td> <td>senf::console::FileConfig()</td></tr>
182     <tr><td><b>Class</b></td>       <td>senf::console::ConfigFile</td></tr>
183     <tr><td><b>Helper</b></td>      <td>senf::console::parseFile()</td></tr>
184     </table>
185
186     In it's simplest form, parsing a configuration file consists of calling
187     senf::console::parseFile() with the name of the respective config file as argument.
188
189     \code
190     senf::console::parseFile("some.conf");
191     \endcode
192
193     To get more flexible, instantiate a senf::console::ConfigFile instance at use that to parse the
194     file
195     
196     \code
197     senf::console::ConfigFile cf ("some.conf");
198     cf.parse();
199     \endcode
200
201     If the application supports other configuration sources besides a single configuration file
202     (like command line options) or if it supports multiple configuration files (e.g. a system-wide
203     and a user specific configuration file) see \ref console_access_multiple and add one (or more)
204     senf::console::FileConfig() source to a senf::console::ConfigBundle.
205
206     \subsubsection console_access_file_syntax Configuration file syntax
207
208     Configuration files are written in a simple configuration language. This language is almost
209     declarative (e.g. it does not have any control-flow statements) but is processed imperatively
210     from top to bottom. This is very simple and flexible.
211
212     Commands are referenced by their path in the node tree. To simplify working with deeply nested
213     directory structures, the current directory may be changed persistently or temporarily for some
214     commands.
215     \code
216     /server/port 1234;
217     
218     /logger/targets/console {
219         accept senf::log::Debug IMPORTANT;
220         accept server::ServerLog CRITICAL;
221     }
222     \endcode
223
224     \see \ref console_parser
225
226     \subsection console_access_options Command line options
227
228     <table class="senf fixedwidth">
229     <tr><td><b>Constructor</b></td> <td>senf::console::OptionsConfig()</td></tr>
230     <tr><td><b>Class</b></td>       <td>senf::console::ProgramOptions</td></tr>
231     <tr><td><b>Helper</b></td>      <td>senf::console::parseOptions()</td></tr>
232     </table>
233
234     Command line options can either be parsed by calling the senf::console::parseOptions() helper
235
236     \code
237     senf::console::parseOptions(argc, argv)
238     \endcode
239
240     or more flexibly by instantiating a senf::console::ProgramOptions class
241
242     \code
243     std::vector<std::string> args;
244     senf::console::ProgramOptions opts (argc, argv);
245     opts
246         .nonOptions(args)
247         .alias('c', "--mycommand",true)
248         .alias('C', "--mycommand=2 3");
249     opts.parse();
250     \endcode
251
252     This registeres two short options and accumulates all non-option arguments in \c args.
253     
254     If the application supports other configuration sources besides the command line options (like
255     configuration files) see \ref console_access_multiple and add a senf::console::OptionsConfig()
256     source to a senf::console::ConfigBundle.
257
258     See \ref senf::console::ProgramOptions for the source specific additional parameters. These
259     apply to senf::console::ProgramOptions and to the senf::console::OptionsConfig() source.
260
261     \subsubsection console_access_options_syntax Options syntax
262
263     Command line options are primarily parsed as long-options. Long options start with '--'. Further
264     '-' characters serve as directory separators if required (that is, they are \e only interpreted
265     as directory separator is there is no entry in the current (sub-) directory matching more than a
266     single name component). This still allows using hyphens in node names.
267
268     Options can be abbreviated at each directory boundary: A command <tt>/foo/bar/do</tt> can be
269     called as <tt>--f-b-d</tt> as long as this name is unique.
270
271     Everything after the first '=' character is parsed into argument tokens using the normal
272     config/console parser. If the option has no '=' character, the list of argument tokens will be
273     empty.
274     
275     <table style="font-size:80%" class="senf">
276     <tr><th>Command</th><th>File syntax</th><th>Option syntax</th></tr>
277
278     <tr>
279       <td><tt>void doo()</tt></td>
280       <td><tt>/path/to/doo;</tt></td>
281       <td><tt>--path-to-doo</tt></td>
282     </tr>
283
284     <tr>
285       <td><tt>void doo(std::string const &)</tt></td>
286       <td><tt>/path/to/doo john.doe@everywhere.org;</tt></td>
287       <td><tt>--path-to-doo="john.doe@everywhere.org"</tt></td>
288     </tr>
289     
290     <tr>
291       <td><tt>void doo(std::string const &)</tt></td>
292       <td><tt>/path/to/doo "some test";</tt></td>
293       <td><tt>--path-to-doo='"some text"'</tt></td>
294     </tr>
295
296     <tr>
297       <td><tt>void doo(std::string const &, int)</tt></td>
298       <td><tt>/path/to/doo take 1;</tt></td>
299       <td><tt>--path-to-doo="take 1"</tt></td>
300     </tr>
301     </table>
302
303     The last column is additionally quoted using standard \c sh quoting: quotes in arguments need to
304     be additionally quoted for the shell.
305
306     Short options are registered as aliases for long options. They can be registered with or without
307     an implied parameter and can optionally take a parameter. so after
308
309     \code
310     opts
311         .alias('c', "--mycommand",true)
312         .alias('C', "--mycommand=2 3");
313     \endcode
314
315     we can call
316
317     <pre>
318     $ program -C -c "4 5"
319     $ program -Cc"4 5"
320     </pre>
321
322     which is the same as
323     
324     <pre>
325     $ program --mycommand="2 3" --mycommand="4 5"
326     </pre>
327
328     (Beware, that the second argument to \c alias() is \e not shell quoted). 
329
330     \subsection console_access_root Changing the root node
331
332     When used in it's default state, parsing will always interpret all commands relative to the
333     senf::console::root() node and will parse a file completely.
334
335     The first possibility to control this is to change the root node. This is done by 
336     \li passing that root node to the helper class or to the parse helper as an additional argument
337         (see the respective documentation).
338     \li passing it to the senf:;console::ConfigBundle constructor when parsing multiple sources.
339     
340     for example:
341
342     \code
343     senf::console::parseFile("/etc/myserver.conf", senf::console::root()['config']);
344     \endcode
345
346     This functionality is even more powerful by combining it with \c link nodes: This allows to
347     selectively choose commands from the node tree which are to be made accessible for
348     configuration. See \ref node_tree.
349
350     \subsection console_access_partial Partial / incremental configuration
351
352     Another feature provided by senf::console::ConfigBundle and all helper classes is partial
353     parsing.
354
355     \code
356     // Create a console/config aware object and place it into the node tree
357     FooObject foo;
358     senf::console::add("foo", foo.dir);
359
360     // Open configuration file
361     senf::console::ConfigFile cf ("/etc/myserver.conf");
362     
363     // Parse only commands in the configuration file which are in the foo.dir directory
364     cf.parse(foo.dir);
365
366     ...
367
368     // Anywhere later, parse the rest of the configuration file
369     cf.parse();
370     \endcode
371
372     This feature allows to parse parts of one or more configuration sources before the
373     console/config tree has been fully established. Partial parsing can be applied any number of
374     times to arbitrary nodes. Any command already parsed will be skipped automatically.
375
376     When combining partial parsing with \c chroot() and \c link's, it is important to realize, that
377     <em>partial parsing always applies to the \e real target and ignores links</em>. This is very
378     important: It allows a subsystem to parse it's configuration parameters irrespective of any
379     links pointing to nodes of that subsystem.
380
381     \subsection console_access_multiple Multiple sources
382
383     Most of the time, an application will utilize multiple configuration sources: A global
384     configuration file, maybe a user specific local configuration file, command line options ...
385
386     When parsing configuration commands, especially using partial / incremental parsing, all parse
387     commands should be applied to each configuration source in turn. This is the responsibility of
388     senf::console::ConfigBundle.
389
390     \code
391     senf::console::ScopedDirectory<> config;
392     senf::console::root().add("config", config);
393
394     // Let's enable all logger commands for configuration
395     config.link("logger", senf::console::root()["logger"]);
396
397     // Create bundle and add sources
398     std::vector<std::string> args;
399     senf::console::ConfigBundle conf (senf::console::root()["config"]);
400     conf.add( senf::console::FileConfig("/etc/myserver.conf") );
401     conf.add( senf::console::FileConfig(".myserver.conf") );
402     conf.add( senf::console::OptionsConfig(senf::Daemon::instance().argc(), 
403                                            senf::Daemon::instance().argv()) )
404         .nonOptions(args)
405         .alias('c', "--mycommand",true)
406         .alias('C', "--mycommand=2 3");
407
408     // Parse the logger subsystem commands in '/logger'
409     conf.parse(senf::console::root()['logger']);
410     
411     ...
412
413     // Parse all other configuration commands. All necessary commands and links in '/config' must by
414     // now have been created.  
415     conf.parse();
416     \endcode
417
418     This example parses three configuration sources: Two configuration files and additional
419     parameters specified on the command line. All the configuration commands are placed into the
420     <tt>/config</tt> directory (directly or via links). The configuration sources are parsed in the
421     order they are specified, so in this case, the command line options will override any options
422     specified in one of the configuration files.
423
424     \section console_access_console The interactive console
425
426     To make the console accessible, it must be initialized when the program is started:
427     \code
428     #include <senf/Console.hh>
429
430     int main(int argc, char * argv [])
431     {
432         // Configure console nodes, add commands ...
433
434         // Start console server
435         senf::console::start(senf::INet4SocketAddress(12345u))
436            .name("myserver");
437
438         // You need to enter the scheduler main-loop for the server to work
439         senf::Scheduler::instance().process();
440        
441         // Alternatively enter the main-loop via the PPI
442         // senf::ppi::run();
443     }
444     \endcode
445
446     This will start the server on IPv4 port 12345. The servers name (as displayed in the interactive
447     console prompt) is set to 'myserver'.
448
449     After launching the application, the server can be accessed at the given port:
450     \htmlonly
451     <pre>
452     bash$ telnet localhost 12345
453     Trying 127.0.0.1...
454     Connected to localhost.
455     Escape character is '^]'.
456
457     myserver:/$ exit
458     Connection closed by foreign host.
459     bash$
460     </pre>
461     \endhtmlonly
462
463     \subsection console_serverclient Server and Client objects
464
465     The senf::console::Server and senf::console::Client objects offer further API calls. To access
466     the server instance you need to store away the senf::console::Server reference returned when
467     starting the server so you can later refer to it:
468     \code
469     int main(int, char**)
470     {
471         senf::console::Server & server ( senf::console::start( ... ) );
472     
473         // Do something ...
474
475         server.stop()
476     }
477     \endcode
478
479     The client instance can be accessed via the \c std::ostream arg of any command callback
480     \code
481     void someCallback(std::ostream & os, ... )
482     {
483         senf::console::Client & client (senf::console::Client::get(os));
484     
485         // Use the client's log target
486         client.route<senf::log::Debug, senf::Log::IMPORTANT>();
487     }
488     \endcode
489
490     \see 
491         senf::console::Server for the Server API \n
492         <a href="classsenf_1_1console_1_1Client-members.html">senf::console::Client / List of all
493         members</a> for the Client API
494
495
496     \subsection console_shell Features of the interactive console shell
497
498     The interactive shell will use the GNU readline library for the first connected
499     instance. Further users will not have access to this functionality since GNU readline is
500     completely non-reentrant.
501
502     The shell supports auto-cd and auto-completion: If you enter the name of a directory at the
503     prompt, the console will change to that directory. With auto-completion, any unique beginning of
504     a path component will be completed automatically and transparently to th corresponding full
505     name.
506
507  */
508
509 /** \defgroup console_commands Supported command types
510
511     The Console/config library supports quite a number of different command types. All these types
512     of command are registered, by passing them to DirectoryNode::add()
513
514     \autotoc
515
516     \section console_cmdadd Adding commands and setting attributes
517
518     Basically, all commands are added using senf::console::DirectoryNode::add(). What exactly
519     happens depends on the type of object added.
520     \code
521     dir.add("name", callback)
522     \endcode
523     will add a command 'name' which will execute 'callback' when called, where 'callback' can be a
524     lot of things as documented in the following chapters.
525
526     The add call always returns (something which can be used as) a reference to the command node
527     added:
528     \code
529     senf::console::CommandNode & node ( dir.add( ... ) );
530     \endcode
531
532     Depending on the object added, you can also bind to a more specific node type
533     (e.g. senf::console::SimpleCommand) if you know the type of node returned.
534
535     Depending on the type of object added, there are additional attributes which can be set. These
536     attributes are always set by calling them on the return value <b>before saving that value as a
537     node reference</b>. It is \e not guaranteed, you can call these members on the node
538     reference.
539     \code
540     dir.add("name", callback)
541         .doc("The documentation");
542     \endcode
543     sets the \e doc attribute (if that is available, otherwise this will fail to compile). The
544     attribute members return value is again (something which can be used as) a reference to the
545     command node
546     \code
547     senf::console::CommandNode & node (
548         dir.add("name", callback)
549             .doc("The documentation") );
550     \endcode
551
552
553     \section console_manualparse Manually parsing command arguments
554
555     This is the most primitive type of command. It will be called with an output stream and with a
556     senf::console::ParseCommandInfo reference which holds information about the command parsed.
557
558     From this information the command callback gets a list of arguments or tokens which then can be
559     interpreted in an arbitrary way.
560     \code
561     void fun1(std::ostream & os, senf::console::ParseCommandInfo const & command)
562     {
563         // Here we declare variables for the arguments
564         std::string value;
565
566         {
567             // We parse the arguments using the CheckedArgumentIteratorWrapper. This wrapper
568             // will throw a SyntaxErrorException if we access a nonexistent argument or if we
569             // do not parse all arguments.
570             senf::console::CheckedArgumentIteratorWrapper args (command.arguments());
571
572             senf::console::ParseCommandInfo::TokensRange argTokens ( *(args++) );
573             if (arg1Tokens.size() != 1)
574                 raise senf::console::SyntaxErrorException("argument syntax error");
575             value = arg1Tokens[0];
576         }
577
578         os << value << std::endl;
579     }
580     \endcode
581     
582     Registering this callback is done by simply adding it. To provide online help, pass it to
583     'doc()':
584     \code
585     senf::console::root()
586         .add("test1", &fun1)
587         .doc("Usage:\n"
588              "    test1 arg\n"
589              "\n"
590              "Echo 'arg' to the console");
591     \endcode
592
593     The callback may now be called interactively on the console by it's registered name:
594     \htmlonly
595     <pre>
596     server:/$ test1
597     invalid number of arguments
598     server:/$ test1 stefan@j32.de
599     stefan@j32.de
600     server:/$ test1 (echo me)
601     argument syntax error
602     server:/$ help test1
603     Usage:
604         test1 arg
605
606     Echo 'arg' to the console
607     server:/$
608     </pre>
609     \endhtmlonly
610
611     As you can see above, the arguments and tokens are returned as <a
612     href="http://www.boost.org/doc/libs/1_33_1/libs/range/doc/utility_class.html#iter_range">
613     boost::iterator_range</a> instances. These behave much like containers: They have \c begin() and
614     \c end() and some other useful members.
615     
616     The parser will have divided the argument tokens into arguments already. This simplifies further
617     parsing. If however you want to access the list of argument tokens as a single list, you can do
618     so using senf::console::ParseCommandInfo::tokens().
619     
620     Parsing arguments is quite simple but can get very tedious. To simplify this task, the parsing
621     can be delegated to the Console/config library. See the next section.
622
623     This type of command has only a single attribute, \e doc to set the commands documentation.
624
625
626     \section console_autoparse Automatic argument parsing
627     
628     To greatly simplify parsing complex commands, we turn to automatic argument parsing. 
629
630     \subsection console_autoadd Adding
631
632     Automatically parsed commands are registered by just adding a callback which has the correct
633     arguments and return-value defined:
634     \code
635     std::string fun2(std::string const & arg)
636     {
637         return arg;
638     }
639     \endcode
640
641     This extremely simple callback may be registered by adding it to a senf::console::DirectoryNode.
642     \code
643     senf::console::root()
644         .add("test2", &fun2);
645     \endcode
646     The functionality is now identical to \c test1:
647     \htmlonly
648     <pre>
649     server:/$ test2
650     invalid number of arguments
651     server:/$ test2 stefan@j32.de
652     stefan@j32.de
653     server:/$ test2 (echo me)
654     argument syntax error
655     server:/$ help test2
656     Usage:
657         test2 arg11:string
658     server:/$
659     </pre>
660     \endhtmlonly
661
662
663     \subsection command_ostream Accessing the console stream
664
665     Commands may have an optional first argument of type <tt>std::ostream &</tt>. This argument is
666     not considered part of the real interface. When the command is executed, the callback will be
667     passed the current consoles output stream object in this argument. With this, the callback can
668     output arbitrary messages to the network console.
669     \code
670     void fun3(std::ostream & os, unsigned n, std::string text)
671     {
672         while (n-- > 0) os << text << std::endl;
673     }
674
675     senf::console::root()
676         .add("test3", &fun3);
677     \endcode
678
679     This simple command can now be used thus:
680     \htmlonly
681     <pre>
682     server:/$ test3
683     invalid number of arguments
684     server:/$ test3 stefan@j32.de
685     invalid number of arguments
686     server:/$ test3 2 ok
687     ok
688     ok
689     server:/$ help test3
690     Usage:
691         test3 arg11:int arg12:string
692     server:/$
693     </pre>
694     \endhtmlonly
695
696     \subsection command_overload Overloading
697
698     Automatically parsed commands can be overloaded: You can register multiple commands under the
699     same name. Each overload is tried in turn until no SyntaxErrorException is raised.
700     \code
701     senf::console::root()
702         .add("test4", &fun3);
703     senf::console::root()
704         .add("test4", &fun2);
705     \endcode
706     And now, we can call \c test4 with one or two args:
707     <pre>
708     server:/$ test4
709     invalid number of arguments
710     server:/$ test4 stefan@j32.de
711     stefan@j32.de
712     server:/$ test4 2 ok
713     ok
714     ok
715     server:/$ help test4
716     Usage:
717         1- test4 arg11:int arg12:string
718         2- test4 arg21:string
719     server:/$
720     </pre>
721
722     One note: When taking the address of an overloaded function (member or non-member), the C++
723     language forces you to cast that address to one of the possible types so the compiler knows,
724     which overload is requested. So to add a function which is overloaded in C++, each overload
725     needs to be added explicitly, casting to the correct type:
726     \code
727     void over(int);
728     void over(int,int);
729
730     senf::console::root()
731         .add("over", static_cast<void (*)(int)>(&over));
732     senf::console::root()
733         .add("over", static_cast<void (*)(int,int)>(&over));
734     \endcode
735
736
737     \subsection console_attributes Attributes
738
739     As have seen so far, some documentation is automatically provided. We can add more info, by
740     setting additional attributes. 
741     \code
742     senf::console::root()
743         .add("test5", &fun3)
744         .doc("Echo text to the console")
745         .overloadDoc("Repeat {arg12} for {arg11} lines");
746     senf::console::root()
747         .add("test4", &fun2)
748         .overloadDoc("Echo the {arg21} argument")
749     \endcode
750
751     This additional info is used to provide more documentation:
752     \htmlonly
753     <pre>
754     server:/$ help test5
755     Usage:
756         1- test5 arg11:int arg12:string
757         2- test5 arg21:string
758
759     Echo text to the console
760
761     Variant 1:
762     Repeat {arg12} for {arg11} lines
763     
764     Variant 2:
765     Echo the {arg21} argument
766     senf:/$
767     </pre>
768     \endhtmlonly
769
770
771     \subsection console_argattributes Argument attributes
772
773     Additional attributes can be set for each parameter. They are all passed to the
774     senf::console::ParsedArgumentAttributor::arg() attribute.
775
776     \code
777     namespace kw = senf::console::kw;
778
779     senf::console::root()
780         .add("test6", &fun3)
781         .doc("Echo text to the console")
782         .overloadDoc("Repeat {text} for {n} lines");
783         .arg( kw::name = "n", kw::description="Number of repetitions" )
784         .arg( kw::name = "text", kw::description="Text to output" );
785     senf::console::root()
786         .add("test6", &fun2)
787         .overloadDoc("Echo the {text} argument")
788         .arg( kw::name = "text" );
789     \endcode
790
791     (Sadly, there is no way to automatically find out the \e name of an argument, just it's type.)
792     Every callback argument corresponds with a call of the \c arg() attribute. Argument attributes
793     are set using keywords from the \ref senf::console::kw namespace. You will probably either use
794     this namespace via a namespace alias (as above) or via a <tt>using namespace
795     senf::console::kw</tt> declaration (but beware of name collisions).
796
797     You don't need to specify any information for an argument: To skip an argument, just call \c
798     arg() without attributes for this argument.
799
800     After adding this information, the online help is much more readable
801       \htmlonly
802     <pre>
803     server:/$ help test6
804     Usage:
805         1- test6 n:int text:string
806         2- test6 text:string
807
808     With:
809         n         Number of repetitions
810         text      Text to output
811
812     Echo text to the console
813
814     Variant 1:
815     Repeat {text} for {n} lines
816     
817     Variant 2:
818     Echo the {text} argument
819     senf:/$
820     </pre>
821     \endhtmlonly
822
823     Since most of the time, we only need to set the name and possibly a description for arguments,
824     there is a shortcut: name and description can be specified as positional arguments in this
825     order. So the following will give the exactly same result as above:
826     \code
827     namespace kw = senf::console::kw;
828
829     senf::console::root()
830         .add("test6", &fun3)
831         .doc("Echo text to the console")
832         .overloadDoc("Repeat <text> for <n> lines");
833         .arg("n",    "Number of repetitions")
834         .arg("text", "Text to output");
835     senf::console::root()
836         .add("test6", &fun2)
837         .overloadDoc("Echo the <text> argument")
838         .arg("text");
839     \endcode
840     
841     Keyword arguments should always be used if additional attributes are set. You can however mix
842     positional and keyword arguments.
843
844     
845     \subsection console_defaults Default values
846     
847     Another information which can not be automatically gathered from the type system is default
848     values. These have to be declared explicitly:
849     \code
850     namespace kw = senf::console::kw;
851
852     senf::console::root()
853         .add("test7", &fun3)
854         .doc("Echo {text} to the console, repeating {text} for {n} lines")
855         .arg("n",    "Number of repetitions", kw::default_value=1)
856         .arg("text", "Text to output");
857     \endcode
858
859     Default values can be used together with overloading. Default (optional) value support is quite
860     flexible, it is not mandatory, for default values to be specified only for the trailing
861     arguments. For the exact definition, how parsed argument values are assigned to overload
862     arguments in the presence of default values, see \ref senf::console::kw::default_value.
863     
864     \htmlonly
865     <pre>
866     server:/$ test7 echo
867     echo
868     server:/$ test7 4 ok
869     ok
870     ok
871     ok
872     ok
873     server:/$ help test7
874     Usage:
875         test4 [n:unsigned] text:string
876     
877     With:
878         n         Number of repetitions
879             default: 1
880         text      Text to output
881
882     Echo {text} to the console, repeating {text} for {n} lines
883     server:/$
884     </pre>
885     \endhtmlonly
886
887
888     \subsection console_boostfn Non-function-pointer commands
889
890     It is possible to add other callable objects besides function (and member-function)
891     pointers. However, since it is not possible to automatically deduce the argument and return
892     types in this case, the callables have to be wrapped in a \c boost::function object:
893
894     \code
895     senf::console::root()
896         .add("test8", 
897              boost::function<void (std::ostream &, std::string const &)>(
898                  boost::bind(&fun3, _1, 4u, _2)));
899     \endcode
900
901     This works with any callable object where argument types cannot be deduced automatically:
902     Boost.Bind expressions, Boost.Lambda expressions, functors and so on.
903     
904     \htmlonly
905     <pre>
906     server:/$ test8 ok
907     ok
908     ok
909     ok
910     ok
911     server:/$ help test8
912     Usage:
913         test8 arg11:string
914     server:/$
915     </pre>
916     \endhtmlonly
917
918
919     \subsection console_attr_summary Attribute summary
920
921     Here a summary of the most common attributes
922
923     <table class="senf fixedwidth">
924
925     <tr><td style="width:14em">\link senf::console::ParsedArgumentAttributorBase::doc() .doc\endlink
926     ( \e doc )</td><td>Set documentation for all overloads</td></tr>
927     
928     <tr><td>\link senf::console::ParsedArgumentAttributorBase::overloadDoc()
929     .overloadDoc\endlink ( \e doc )</td><td>Set documentation for a specific overload</td></tr>
930
931     <tr><td>\link senf::console::ParsedArgumentAttributor::arg() .arg\endlink ( \e argument \e
932     attributes )</td><td>Set argument attributes (see below)</td></tr>
933
934     </table>
935
936     The most important argument attributes (all defined in the senf::console::kw namespace) are:
937     
938     <table class="senf fixed width">
939
940     <tr><td style="width:14em">\link senf::console::kw::name kw::name\endlink</td><td>Parameter
941     name</td></tr>
942
943     <tr><td>\link senf::console::kw::description kw::description\endlink</td><td>One-line
944     description of the argument</td></tr>
945
946     <tr><td>\link senf::console::kw::default_value kw::default_value\endlink</td><td>Arguments
947     default value</td></tr>
948
949     </table>
950
951     \see <a
952         href="classsenf_1_1console_1_1ParsedArgumentAttributor-members.html">senf::console::ParsedArgumentAttributor
953         / List of all members</a> for the complete attribute interface \n
954         \ref senf::console::kw for a list of all argument attribute keywords
955
956         
957     \section console_memberfn Member functions
958     
959     Non-static member functions are supported like non-member functions (static member functions are
960     identical to non-members). They must however be added through a senf::console::ScopedDirectory
961     instance to bind them to their instance.
962     \code
963     class Test1
964     {
965     public:
966         senf::console::ScopedDirectory<Test1> dir;
967
968         Test1(std::string label) : dir(this), label_ (label) 
969             { dir.add("test", &Test::test1);
970               dir.add("test", &Test::test2); }
971     
972         std::string test1(std::string const & text)
973             { return label_ + ": " + text; }
974
975         void test2(std::ostream & os, unsigned n, std::string const & text) 
976             { while (n-- > 0) os << label << ": " << text << std::endl; }
977
978     private:
979         std::string label_;
980     };
981
982     // ...
983
984     Test1 test1ob ("test");
985     senf::console::root().add("test1ob", test1ob.dir);
986     \endcode
987
988     Binding via senf::console::ScopedDirectory ensures, that the commands are automatically removed
989     from the tree when the object is destroyed.
990
991
992     \section console_variables Variables
993     
994     \subsection console_varadd Adding
995
996     The console/config library supports the direct registration of variables as commands. A
997     variable command consists of two overloads, one to query the current value and one to change the
998     value. 
999     \code
1000     class Test2
1001     {
1002     public:
1003         senf::console::ScopedDirectory<Test2> dir;
1004
1005         Test2() : dir(this), var_(0)
1006             { dir.add("var", var_); }
1007
1008     private:
1009         int var_;
1010     };
1011
1012     Test2 test2ob;
1013     senf::console::root().add("test2ob", test2ob.dir);
1014     \endcode
1015     This shows the most common scenario: A member variable is added to a ScopedDirectory of the same
1016     class. This ensures, that the variable command node is removed from the tree when the instance
1017     (and thereby the variable) are destroyed. The variable can now be used like any other command:
1018     \htmlonly
1019     <pre>
1020     server:/$ test2ob/var
1021     0
1022     server:/$ test2ob/var 10
1023     server:/$ test2ob/var
1024     10
1025     server:/$ help test2ob
1026     Usage:
1027         1- var new_value:int
1028         2- var
1029     server:/$
1030     </pre>
1031     \endhtmlonly
1032
1033
1034     \subsection console_varro Read-only variables
1035     
1036     The library also supports read-only variables. To make a variable read-only, just wrap it in \c
1037     boost::cref() (where \c cref stands for \c const reference)
1038     \code
1039     int var (0);
1040
1041     senf::console::root().add("var1", boost::cref(var));
1042     \endcode
1043     A read-only variable only has a single overload:
1044     \htmlonly
1045     <pre>
1046     server:/$ var1
1047     0
1048     server:/$ help var1
1049     Usage:
1050         var1
1051     server:/$ 
1052     </pre>
1053     \endhtmlonly
1054
1055
1056     \subsection console_varattr Attributes
1057
1058     The most important Variable command attributes are
1059
1060     <table class="senf fixedwidth">
1061
1062     <tr><td style="width:14em">\link senf::console::VariableAttributor::doc() .doc\endlink
1063     ( \e doc )</td><td>Set variable documentation</td></tr>
1064     
1065     <tr><td>\link senf::console::VariableAttributor::onChange() .onChange\endlink
1066     ( \e handler )</td><td>Set change handler</td></tr>
1067     
1068     </table>
1069
1070     \see senf::console::VariableAttributor for the complete attribute interface
1071
1072     \subsection console_varchange Change notification
1073
1074     A \e handler can be set to be called, whenever the variable is changed. It will be called with a
1075     reference to the old value. The handler is called, after the value has been changed
1076
1077     \code
1078     int var (0);
1079
1080     // Since this is int, it would make sense to declare the argument pass-by-value (int old)
1081     // but for more complex args, use a const & here
1082     void varChanged(int const & old)
1083     {
1084         // ...
1085     }
1086
1087     senf::console::root().add("var2",var)
1088         .onChange(&varChanged);
1089     \endcode
1090     
1091     After this setup, \c varChanged will be called, whenever the value has changed.
1092
1093
1094     \section console_args Registering special argument types
1095
1096     By default, argument types which can be read and written using \c iostreams are automatically
1097     supported. Other types need to be registered explicitly
1098
1099
1100     \subsection console_args_enum Registering enum types
1101
1102     Enum types are a special case, since it is not possible, to find a string representation for the
1103     enumerator values automatically. Therefore, enum types need to be registered manually.
1104     \code
1105     enum MyEnum { Sit, Run, Jump };
1106     SENF_CONSOLE_REGISTER_ENUM( MyEnum, (Sit)(Run)(Jump) );
1107
1108     MyEnum fun4(MyEnum v) { return v }
1109
1110     senf::console::root()
1111         .add("test9", &fun4);
1112     \endcode
1113
1114     After an enum type is registered, it can be used like any other type for arguments or
1115     return-values:
1116
1117     \htmlonly
1118     <pre>
1119     server:/$ test9 Sit
1120     Sit
1121     server:/$ test9 Crawl
1122     argument syntax error: invalid enum value
1123     server:/$ help test9
1124     Usage:
1125         test9 arg11:MyEnum
1126     server:/$
1127     </pre>
1128     \endhtmlonly
1129
1130     \ref SENF_CONSOLE_REGISTER_ENUM() can only be used, to register enums at namespace scope. To
1131     register enums defined within some class, use \ref SENF_CONSOLE_REGISTER_ENUM_MEMBER()
1132
1133     \code
1134     class Test3
1135     {
1136     public:
1137         enum Color { Red, Green, Blue };
1138     
1139         senf::console::ScopedDirectory<MyClass> dir;
1140
1141         Test3();
1142
1143         Color mem3(Color c) { return c }
1144     };
1145     SENF_CONSOLE_REGISTER_ENUM_MEMBER( Test3, Color, (Red)(Green)(Blue) );
1146
1147     Test3::Test3() : dir(this)
1148         { dir.add("test", &MyClass::mem3); }
1149     
1150     Test3 test3ob;
1151     senf::console::root().add("test3ob", test3ob.dir);
1152     \endcode
1153
1154     Using this command/type is identical
1155     \htmlonly
1156     <pre>
1157     server:/$ test3ob/test Red
1158     Red
1159     server:/$ test3ob/test White
1160     argument syntax error: invalid enum value
1161     server:/$ help test3ob/test
1162     Usage:
1163         test arg11:Color
1164     </pre>
1165     \endhtmlonly
1166
1167
1168     \subsection console_args_custom Customizing argument and return value parsing/formatting
1169
1170     To support or customize parsing/formatting of other types, they need to be registered. In it's
1171     simplest case, this works, by just providing an appropriate overload for
1172     senf_console_parse_argument() and senf_console_format_value():
1173     \code
1174     struct Coordinate
1175     {
1176         Coordinate() : x(0), y(0) {}
1177         Coordinate(int x_, int y_) : x(x_), y(y_) {}
1178
1179         int x, y;
1180     }
1181
1182     void senf_console_parse_argument(senf::console::ParseCommandInfo::TokensRange const & tokens,
1183                                      Coordinate & out)
1184     {
1185         senf::console::CheckedArgumentIteratorWrapper arg (tokens);
1186         senf::console::parse( *(arg++), out.x );
1187         senf::console::parse( *(arg++), out.y );
1188     }
1189
1190     void senf_console_format_value(Coordinate const & value, std::ostream & os)
1191     {
1192         os << '(' << value.x << ' ' << value.y << ')';
1193     }
1194     \endcode 
1195
1196     The parser will accept an argument with two tokens which are each forwarded to the integer
1197     parser. The senf::console::CheckedArgumentIteratorWrapper ensures two things: That all input
1198     tokens are parsed and no extra trailing tokens are left unparsed and it checks, that all
1199     referenced tokens really exist.
1200
1201     The formatter writes out the value as a parenthesized pair.
1202
1203     \code
1204     Coordinate fun5(Coordinate const & p) { return Coordinate(2*p.x, 2*p.y) }
1205     
1206     namespace kw = senf::console::kw;
1207
1208     senf::console::root()
1209         .add("test10", &fun5)
1210         .arg("x","coordinate to double",
1211              kw::default_value = Coordinate())
1212     \endcode
1213     We can now call \c test10 with a coordinate argument:
1214     \htmlonly
1215     <pre>
1216     server:/$ test10 (2 7)
1217     (4 14)
1218     server:/$ help test10
1219     Usage:
1220         test10 [x:Coordinate]
1221
1222     With:
1223         x         Coordinate to double
1224             default: (0 0)
1225     server:/$
1226     </pre>
1227     \endhtmlonly
1228     
1229     If you want to customize the formatting of default values differently from the formating of
1230     return-values or if you want to change the displayed name of a type, you will need to specialize
1231     the senf::console::ArgumentTraits class instead of implementing
1232     senf_console_parse_argument(). See senf::console::ArgumentTraits and
1233     senf::console::ReturnValueTraits for more.
1234  */
1235
1236 \f
1237 // Local Variables:
1238 // mode: c++
1239 // fill-column: 100
1240 // comment-column: 40
1241 // c-file-style: "senf"
1242 // indent-tabs-mode: nil
1243 // ispell-local-dictionary: "american"
1244 // compile-command: "scons -u test"
1245 // mode: auto-fill
1246 // End:
1247