aboutsummaryrefslogtreecommitdiff
path: root/argparse/README.rst
diff options
context:
space:
mode:
Diffstat (limited to 'argparse/README.rst')
-rw-r--r--argparse/README.rst341
1 files changed, 341 insertions, 0 deletions
diff --git a/argparse/README.rst b/argparse/README.rst
new file mode 100644
index 0000000..8a3fca0
--- /dev/null
+++ b/argparse/README.rst
@@ -0,0 +1,341 @@
+========
+Argparse
+========
+
+The ``rust-argparse`` is command-line parsing module for rust. It's inspired
+by python's ``argparse`` module.
+
+Features:
+
+* Supports standard (GNU) option conventions
+* Properly typed values
+* Automatically generated help and usage messages
+
+Importing
+=========
+Edit your Cargo.toml to add ``rust-argparse`` to your project.
+
+.. code-block:: rust
+
+ [dependencies]
+ argparse = "0.2.2"
+
+
+Example
+=======
+
+The following code is a simple Rust program with command-line arguments:
+
+.. code-block:: rust
+
+ extern crate argparse;
+
+ use argparse::{ArgumentParser, StoreTrue, Store};
+
+ fn main() {
+ let mut verbose = false;
+ let mut name = "World".to_string();
+ { // this block limits scope of borrows by ap.refer() method
+ let mut ap = ArgumentParser::new();
+ ap.set_description("Greet somebody.");
+ ap.refer(&mut verbose)
+ .add_option(&["-v", "--verbose"], StoreTrue,
+ "Be verbose");
+ ap.refer(&mut name)
+ .add_option(&["--name"], Store,
+ "Name for the greeting");
+ ap.parse_args_or_exit();
+ }
+
+ if verbose {
+ println!("name is {}", name);
+ }
+ println!("Hello {}!", name);
+ }
+
+Assuming the Rust code above is saved into a file ``greeting.rs``, let's see
+what we have now::
+
+ $ rustc greeting.rs
+ $ ./greeting -h
+ Usage:
+ ./greeting [OPTIONS]
+
+ Greet somebody.
+
+ Optional arguments:
+ -h, --help Show this help message and exit
+ -v, --verbose
+ Be verbose
+ --name NAME Name for the greeting
+ $ ./greeting
+ Hello World!
+ $ ./greeting --name Bob
+ Hello Bob!
+ $ ./greeting -v --name Alice
+ name is Alice
+ Hello Alice!
+
+
+Basic Workflow
+==============
+
+
+Create ArgumentParser
+---------------------
+
+The argument parser is created empty and is built incrementally. So we create
+a mutable variable::
+
+ extern crate argparse;
+ use argparse::ArgumentParser;
+
+ let mut parser = ArgumentParser::new();
+
+
+Customize
+---------
+
+There are optional customization methods. The most important one is::
+
+ parser.set_description("My command-line utility")
+
+The descripion is rewrapped to fit 80 column string nicely. Just like option
+descriptions.
+
+Add Options
+-----------
+
+The ``refer`` method creates a cell variable, which the result will be written
+to::
+
+ let mut verbose = false;
+ parser.refer(&mut verbose);
+
+Next we add an options which control the variable:
+For example::
+
+ parser.refer(&mut verbose)
+ .add_option(&["-v", "--verbose"], StoreTrue,
+ "Be verbose");
+
+You may add multiple options for the same variable::
+
+ parser.refer(&mut verbose)
+ .add_option(&["-v", "--verbose"], StoreTrue,
+ "Be verbose")
+ .add_option(&["-q", "--quiet"], StoreFalse,
+ "Be verbose");
+
+Similarly positional arguments are added::
+
+ let mut command = String;
+ parser.refer(&mut command)
+ .add_argument("command", Store,
+ "Command to run");
+
+
+
+Organizing Options
+------------------
+
+It's often useful to organize options into some kind of structure. You can
+easily borrow variables from the structure into option parser. For example::
+
+ struct Options {
+ verbose: bool,
+ }
+ ...
+ let mut options = Options { verbose: false };
+ parser.refer(&mut options.verbose)
+ .add_option(&["-v"], StoreTrue,
+ "Be verbose");
+
+
+Parsing Arguments
+-----------------
+
+All the complex work is done in ``parser.parse_args()``. But there is
+a simpler option::
+
+ parser.parse_args_or_exit()
+
+In case you don't want argparse to exit itself, you might use the
+``parse_args`` function directly::
+
+ use std::process::exit;
+
+ match parser.parse_args() {
+ Ok(()) => {}
+ Err(x) => {
+ std::process::exit(x);
+ }
+ }
+
+
+ArgumentParser Methods
+======================
+
+``parser.refer<T>(var: &mut T) -> Ref``
+ Attach the variable to argument parser. The options are added to the
+ returned ``Ref`` object and modify a variable passed to the method.
+
+``parser.add_option(names: &[&str], action: TypedAction, help: &str)``
+ Add a single option which has no parameters. Most options must be added
+ by ``refer(..)`` and methods on ``Ref`` object (see below).
+
+ Example::
+
+ ap.add_option(&["-V", "--version"],
+ Print(env!("CARGO_PKG_VERSION").to_string()), "Show version");
+
+``parser.set_description(descr: &str)``
+ Set description that is at the top of help message.
+
+``parser.stop_on_first_argument(val: bool)``
+ If called with ``true``, parser will stop searching for options when first
+ non-option (the one doesn't start with ``-``) argument is encountered. This
+ is useful if you want to parse following options with another argparser or
+ external program.
+
+``parser.silence_double_dash(val: bool)``
+ If called with ``true`` (default), parser will not treat *first* double
+ dash ``--`` as positional argument. Use ``false`` if you need to add some
+ meaning to the ``--`` marker.
+
+``parser.print_usage(name: &str, writer: &mut Write)``
+ Prints usage string to stderr.
+
+``parser.print_help(name: &str, writer: &mut Write)``
+ Writes help to ``writer``, used by ``--help`` option internally.
+
+``parser.parse_args()``
+ Method that does all the dirty work. And returns ``Result``
+
+``parser.parse_args_or_exit()``
+ Method that does all the dirty work. And in case of failure just ``exit()``
+
+
+Variable Reference Methods
+==========================
+
+The ``argparse::Ref`` object is returned from ``parser.refer()``.
+The following methods are used to add and customize arguments:
+
+``option.add_option(names: &[&str], action: TypedAction, help: &str)``
+ Add an option. All items in names should be either in format ``-X`` or
+ ``--long-option`` (i.e. one dash and one char or two dashes and long name).
+ How this option will be interpreted and whether it will have an argument
+ dependes on the action. See below list of actions.
+
+``option.add_argument(name: &str, action: TypedAction, help: &str)``
+ Add a positional argument
+
+``option.metavar(var: &str)``
+ A name of the argument in usage messages (for options having argument).
+
+``option.envvar(var: &str)``
+ A name of the environment variable to get option value from. The value
+ would be parsed with ``FromStr::from_str``, just like an option having
+ ``Store`` action.
+
+``option.required()``
+ The option or argument is required (it's optional by default). If multiple
+ options or multiple arguments are defined for this reference at least one
+ of them is required.
+
+
+Actions
+=======
+
+The following actions are available out of the box. They may be used in either
+``add_option`` or ``add_argument``:
+
+``Store``
+ An option has single argument. Stores a value from command-line in a
+ variable. Any type that has the ``FromStr`` and ``Clone`` traits implemented
+ may be used.
+
+``StoreOption``
+ As ``Store``, but wrap value with ``Some`` for use with ``Option``. For
+ example:
+
+ let mut x: Option<i32> = None;
+ ap.refer(&mut x).add_option(&["-x"], StoreOption, "Set var x");
+
+``StoreConst(value)``
+ An option has no arguments. Store a hard-coded ``value`` into variable,
+ when specified. Any type with the ``Clone`` trait implemented may be used.
+
+``PushConst(value)``
+ An option has no arguments. Push a hard-coded ``value`` into variable,
+ when specified. Any type which has the ``Clone`` type implemented may be
+ used. Option might used for a list of operations to perform, when ``required``
+ is set for this variable, at least one operation is required.
+
+``StoreTrue``
+ Stores boolean ``true`` value in a variable.
+ (shortcut for ``StoreConst(true)``)
+
+``StoreFalse``
+ Stores boolean ``false`` value in a variable.
+ (shortcut for ``StoreConst(false)``)
+
+
+``IncrBy(num)``
+ An option has no arguments. Increments the value stored in a variable by a
+ value ``num``. Any type which has the ``Add`` and ``Clone`` traits may be used.
+
+``DecrBy(nym)``
+ Decrements the value stored in a variable by a value ``num``. Any type
+ which has the ``Add`` and ``Clone`` traits may be used.
+
+``Collect``
+ When used for an ``--option``, requires single argument. When used for a
+ positional argument consumes all remaining arguments. Parsed options are
+ added to the list. I.e. a ``Collect`` action requires a
+ ``Vec<int>`` variable. Parses arguments using ``FromStr`` trait.
+
+``List``
+ When used for positional argument, works the same as ``List``. When used
+ as an option, consumes all remaining arguments.
+
+ Note the usage of ``List`` is strongly discouraged, because of complex
+ rules below. Use ``Collect`` and positional options if possible. But usage
+ of ``List`` action may be useful if you need shell expansion of anything
+ other than last positional argument.
+
+ Let's learn rules by example. For the next options::
+
+ ap.refer(&mut lst1).add_option(&["-X", "--xx"], List, "List1");
+ ap.refer(&mut lst2).add_argument("yy", List, "List2");
+
+ The following command line::
+
+ ./run 1 2 3 -X 4 5 6
+
+ Will return ``[1, 2, 3]`` in the ``lst1`` and the ``[4,5,6]`` in the
+ ``lst2``.
+
+ Note that using when using ``=`` or equivalent short option mode, the
+ 'consume all' mode is not enabled. I.e. in the following command-line::
+
+ ./run 1 2 -X3 4 --xx=5 6
+
+ The ``lst1`` has ``[3, 5]`` and ``lst2`` has ``[1, 2, 4, 6]``.
+ The argument consuming also stops on ``--`` or the next option::
+
+ ./run: -X 1 2 3 -- 4 5 6
+ ./run: -X 1 2 --xx=3 4 5 6
+
+ Both of the above parse ``[4, 5, 6]`` as ``lst1`` and
+ the ``[1, 2, 3]`` as the ``lst2``.
+
+``Print(value)``
+ Print the text and exit (with status ``0``). Useful for ``--version``
+ option::
+
+ ap.add_option(&["-V", "--version"],
+ Print(env!("CARGO_PKG_VERSION").to_string()), "Show version");
+
+