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