From 6cc39ef5d59bbca7abc7053ce46e06c6d0eeb8bb Mon Sep 17 00:00:00 2001
From: Manuel Weberndorfer <manuel.weberndorfer@id.ethz.ch>
Date: Mon, 9 Nov 2020 12:25:26 +0000
Subject: [PATCH] add cmdline documentation

---
 cmdline/README.rst       | 156 +++++++++++++++++++++++++++++++++++++++
 docs/build_documentation |   2 +
 docs/index.rst           |   1 +
 3 files changed, 159 insertions(+)
 create mode 100644 cmdline/README.rst

diff --git a/cmdline/README.rst b/cmdline/README.rst
new file mode 100644
index 00000000..84e099b6
--- /dev/null
+++ b/cmdline/README.rst
@@ -0,0 +1,156 @@
+..
+    © 2020 ETH Zurich, Mechanics and Materials Lab
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+The CmdLine Library
+===================
+
+Introduction
+------------
+
+This library assists with reading parameters from the command line.
+It supports different types of arguments, including floating point numbers, integers, and booleans.
+Moreover, it automatically generates a ``--help`` flag that provides custom information about the available flags.
+
+Tutorial
+--------
+
+To use this library, you only need to familiarize yourself with a single class.
+This class is called ``CommandLineOptionParser``.
+It's in the namespace ``ae108::cmdline``.
+
+.. doxygenclass:: ae108::cmdline::CommandLineOptionParser
+
+Example Setup
+^^^^^^^^^^^^^
+
+Let's try using this class in a simple example.
+
+.. code-block:: cpp
+
+    #include <ae108/cmdline/CommandLineOptionParser.h>
+    #include <iostream>
+
+    int main(const int argc, const char *const *const argv) {
+        /**
+         * @todo use command line options
+         */
+    }
+
+Construction
+^^^^^^^^^^^^
+
+To parse the command line parameters, we'll construct a ``CommandLineOptionParser`` by providing a stream.
+
+.. doxygenfunction:: ae108::cmdline::CommandLineOptionParser::CommandLineOptionParser
+
+Let's say we want to print error messages and warnings to ``stderr``.
+
+.. code-block:: cpp
+
+    namespace cmdline = ae108::cmdline;
+    cmdline::CommandLineOptionParser(std::cerr)
+        /**
+         * @todo define available options
+         */
+        ;
+
+Adding Options
+^^^^^^^^^^^^^^
+
+The only thing that is missing are the options that we would like to parse.
+In this example, we are going greet the world if greetings are enabled via a command line flag.
+The ``CommandLineOptionParser`` class provides a ``withOption`` method to add flags.
+
+In this example we'll add a flag ``--greet`` (with a short form ``-g``) together with a help text describing the flag.
+
+.. code-block:: cpp
+
+    auto enable_greeting = bool{false};
+    cmdline::CommandLineOptionParser(std::cerr)
+        .withOption("enable_greeting,g", "Print a greeting.", &enable_greeting)
+        .parse(argc, argv);
+
+    if (enable_greeting) {
+        std::cout << "Hello world!" << std::endl;
+    }
+
+Let's see it in action.
+
+.. code-block:: shell-session
+
+    $ cmdline/examples/ae108-CmdLineExample
+    $ cmdline/examples/ae108-CmdLineExample --enable_greeting=yes
+    Hello world!
+    $ cmdline/examples/ae108-CmdLineExample --enable_greeting=no
+    $ cmdline/examples/ae108-CmdLineExample -g yes
+    Hello world!
+
+As promised, there's also a ``--help`` flag:
+
+.. code-block:: shell-session
+
+    $ cmdline/examples/ae108-CmdLineExample --help
+    Command line options:
+    -h [ --help ]                Show this help.
+    -g [ --enable_greeting ] arg Print a greeting.
+
+Moreover, a warning message is printed out to ``stderr`` if an unknown flag is used.
+
+.. code-block:: shell-session
+
+    $ cmdline/examples/ae108-CmdLineExample --unknown_flag=123
+    Warning: The following options were not recognized by cmdline: '--unknown_flag=123'.
+
+Most importantly, invalid command line parameters are rejected with a suitable error message.
+
+.. code-block:: shell-session
+
+    $ cmdline/examples/ae108-CmdLineExample --enable_greeting=123
+    the argument ('123') for option '--enable_greeting' is invalid. Valid choices are 'on|off', 'yes|no', '1|0' and 'true|false'
+
+Example Source Code
+^^^^^^^^^^^^^^^^^^^
+
+The full source code of the example is available in ``cmdline/examples/Example.cc``.
+If you want to build it and try it out, the executable target is called ``ae108-CmdLineExample``.
+
+Outlook
+-------
+
+We've seen many of the features in action, but there's a bit more to explore.
+For instance, it's possible to chain more than one call to ``withOption``:
+
+.. code-block:: cpp
+
+    cmdline::CommandLineOptionParser(std::cerr)
+        .withOption(/* ... */)
+        .withOption(/* ... */)
+        .parse(argc, argv);
+
+Also, there is another overload of ``withOption`` that permits to add flags without a help text.
+
+Interface Documentation
+^^^^^^^^^^^^^^^^^^^^^^^
+
+For reference, here's the documentation of the full interface of the ``CommandLineOptionParser`` class.
+
+.. doxygenclass:: ae108::cmdline::CommandLineOptionParser
+    :members:
+
+Tests
+^^^^^
+
+Finally, feel free to check out the tests in ``cmdline/test/CommandLineOptionParser_Test.cc``.
+They showcase the features of the library in many common use cases.
diff --git a/docs/build_documentation b/docs/build_documentation
index 4d097d33..d2ebff73 100755
--- a/docs/build_documentation
+++ b/docs/build_documentation
@@ -23,6 +23,7 @@ ROOT_DIRECTORY=$(readlink -e $(dirname "$0"))/..
     echo GENERATE_LATEX=NO; \
     echo GENERATE_XML=YES; \
     echo INPUT="$ROOT_DIRECTORY/cmdline/src/include" \
+               "$ROOT_DIRECTORY/cmdline/examples" \
                "$ROOT_DIRECTORY/cpppetsc/src/include" \
                "$ROOT_DIRECTORY/assembly/src/include" \
                "$ROOT_DIRECTORY/solve/src/include"; \
@@ -52,6 +53,7 @@ pandoc \
     -t rst \
     "$ROOT_DIRECTORY/README.md"
 cp "$ROOT_DIRECTORY/docs/index.rst" source/index.rst
+cp "$ROOT_DIRECTORY/cmdline/README.rst" source/Cmdline.rst
 
 make -j$(nproc) html
 make -j$(nproc) latexpdf
diff --git a/docs/index.rst b/docs/index.rst
index a2966120..bb2df9f1 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -18,3 +18,4 @@ Welcome to AE108!
 
 .. toctree::
     Getting Started <README.rst>
+    Cmdline.rst
-- 
GitLab