xref: /dpdk/doc/guides/prog_guide/argparse_lib.rst (revision 51a639ca804234462df0a8c72523fa71181cea24)
1e3e579f5SChengwen Feng.. SPDX-License-Identifier: BSD-3-Clause
2e3e579f5SChengwen Feng   Copyright(c) 2024 HiSilicon Limited
3e3e579f5SChengwen Feng
4e3e579f5SChengwen FengArgparse Library
5e3e579f5SChengwen Feng================
6e3e579f5SChengwen Feng
7e3e579f5SChengwen FengThe argparse library provides argument parsing functionality,
8e3e579f5SChengwen Fengthis library makes it easy to write user-friendly command-line program.
9e3e579f5SChengwen Feng
10e3e579f5SChengwen FengFeatures and Capabilities
11e3e579f5SChengwen Feng-------------------------
12e3e579f5SChengwen Feng
13e3e579f5SChengwen Feng- Support parsing optional argument (which could take with no-value,
14e3e579f5SChengwen Feng  required-value and optional-value).
15e3e579f5SChengwen Feng
16e3e579f5SChengwen Feng- Support parsing positional argument (which must take with required-value).
17e3e579f5SChengwen Feng
18e3e579f5SChengwen Feng- Support automatic generate usage information.
19e3e579f5SChengwen Feng
20e3e579f5SChengwen Feng- Support issue errors when provide with invalid arguments.
21e3e579f5SChengwen Feng
22e3e579f5SChengwen Feng- Support parsing argument by two ways:
23e3e579f5SChengwen Feng
24e3e579f5SChengwen Feng  #. autosave: used for parsing known value types;
25e3e579f5SChengwen Feng  #. callback: will invoke user callback to parse.
26e3e579f5SChengwen Feng
27e3e579f5SChengwen FengUsage Guide
28e3e579f5SChengwen Feng-----------
29e3e579f5SChengwen Feng
30e3e579f5SChengwen FengThe following code demonstrates how to use:
31e3e579f5SChengwen Feng
32e3e579f5SChengwen Feng.. code-block:: C
33e3e579f5SChengwen Feng
34e3e579f5SChengwen Feng   static int
35e3e579f5SChengwen Feng   argparse_user_callback(uint32_t index, const char *value, void *opaque)
36e3e579f5SChengwen Feng   {
37e3e579f5SChengwen Feng      if (index == 1) {
38e3e579f5SChengwen Feng         /* process "--ddd" argument, because it is configured as no-value,
39e3e579f5SChengwen Feng          * the parameter 'value' is NULL.
40e3e579f5SChengwen Feng          */
41e3e579f5SChengwen Feng         ...
42e3e579f5SChengwen Feng      } else if (index == 2) {
43e3e579f5SChengwen Feng         /* process "--eee" argument, because it is configured as
44e3e579f5SChengwen Feng          * required-value, the parameter 'value' must not be NULL.
45e3e579f5SChengwen Feng          */
46e3e579f5SChengwen Feng         ...
47e3e579f5SChengwen Feng      } else if (index == 3) {
48e3e579f5SChengwen Feng         /* process "--fff" argument, because it is configured as
49e3e579f5SChengwen Feng          * optional-value, the parameter 'value' maybe NULL or not NULL,
50e3e579f5SChengwen Feng          * depend on input.
51e3e579f5SChengwen Feng          */
52e3e579f5SChengwen Feng         ...
53e3e579f5SChengwen Feng      } else if (index == 300) {
54e3e579f5SChengwen Feng         /* process "ppp" argument, because it's a positional argument,
55e3e579f5SChengwen Feng          * the parameter 'value' must not be NULL.
56e3e579f5SChengwen Feng          */
57e3e579f5SChengwen Feng         ...
58e3e579f5SChengwen Feng      } else {
59e3e579f5SChengwen Feng         return -EINVAL;
60e3e579f5SChengwen Feng      }
61e3e579f5SChengwen Feng   }
62e3e579f5SChengwen Feng
63e3e579f5SChengwen Feng   static int aaa_val, bbb_val, ccc_val, ooo_val;
64e3e579f5SChengwen Feng
65e3e579f5SChengwen Feng   static struct rte_argparse obj = {
66e3e579f5SChengwen Feng      .prog_name = "test-demo",
67e3e579f5SChengwen Feng      .usage = "[EAL options] -- [optional parameters] [positional parameters]",
68e3e579f5SChengwen Feng      .descriptor = NULL,
69e3e579f5SChengwen Feng      .epilog = NULL,
70e3e579f5SChengwen Feng      .exit_on_error = true,
71e3e579f5SChengwen Feng      .callback = argparse_user_callback,
72e3e579f5SChengwen Feng      .args = {
73e3e579f5SChengwen Feng         { "--aaa", "-a", "aaa argument", &aaa_val, (void *)100, RTE_ARGPARSE_ARG_NO_VALUE       | RTE_ARGPARSE_ARG_VALUE_INT },
74e3e579f5SChengwen Feng         { "--bbb", "-b", "bbb argument", &bbb_val, NULL,        RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT },
75e3e579f5SChengwen Feng         { "--ccc", "-c", "ccc argument", &ccc_val, (void *)200, RTE_ARGPARSE_ARG_OPTIONAL_VALUE | RTE_ARGPARSE_ARG_VALUE_INT },
76e3e579f5SChengwen Feng         { "--ddd", "-d", "ddd argument", NULL,     (void *)1,   RTE_ARGPARSE_ARG_NO_VALUE       },
77e3e579f5SChengwen Feng         { "--eee", "-e", "eee argument", NULL,     (void *)2,   RTE_ARGPARSE_ARG_REQUIRED_VALUE },
78e3e579f5SChengwen Feng         { "--fff", "-f", "fff argument", NULL,     (void *)3,   RTE_ARGPARSE_ARG_OPTIONAL_VALUE },
79e3e579f5SChengwen Feng         { "ooo",   NULL, "ooo argument", &ooo_val, NULL,        RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT },
80e3e579f5SChengwen Feng         { "ppp",   NULL, "ppp argument", NULL,     (void *)300, RTE_ARGPARSE_ARG_REQUIRED_VALUE },
81e3e579f5SChengwen Feng      },
82e3e579f5SChengwen Feng   };
83e3e579f5SChengwen Feng
84e3e579f5SChengwen Feng   int
85e3e579f5SChengwen Feng   main(int argc, char **argv)
86e3e579f5SChengwen Feng   {
87e3e579f5SChengwen Feng      ...
88e3e579f5SChengwen Feng      ret = rte_argparse_parse(&obj, argc, argv);
89e3e579f5SChengwen Feng      ...
90e3e579f5SChengwen Feng   }
91e3e579f5SChengwen Feng
92e3e579f5SChengwen FengIn this example, the arguments which start with a hyphen (-) are optional
93*51a639caSChengwen Fengarguments (they're ``--aaa``/``--bbb``/``--ccc``/``--ddd``/``--eee``/``--fff``);
94*51a639caSChengwen Fengand the arguments which don't start with a hyphen (-) are positional arguments
95*51a639caSChengwen Feng(they're ``ooo``/``ppp``).
96e3e579f5SChengwen Feng
97e3e579f5SChengwen FengEvery argument must be set whether to carry a value (one of
98e3e579f5SChengwen Feng``RTE_ARGPARSE_ARG_NO_VALUE``, ``RTE_ARGPARSE_ARG_REQUIRED_VALUE`` and
99e3e579f5SChengwen Feng``RTE_ARGPARSE_ARG_OPTIONAL_VALUE``).
100e3e579f5SChengwen Feng
101e3e579f5SChengwen Feng.. note::
102e3e579f5SChengwen Feng
103e3e579f5SChengwen Feng   Positional argument must set ``RTE_ARGPARSE_ARG_REQUIRED_VALUE``.
104e3e579f5SChengwen Feng
105e3e579f5SChengwen FengUser Input Requirements
106e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~
107e3e579f5SChengwen Feng
108e3e579f5SChengwen FengFor optional arguments which take no-value,
109*51a639caSChengwen Fengthe following mode is supported (take above ``--aaa`` as an example):
110e3e579f5SChengwen Feng
111*51a639caSChengwen Feng- The single mode: ``--aaa`` or ``-a``.
112e3e579f5SChengwen Feng
113e3e579f5SChengwen FengFor optional arguments which take required-value,
114*51a639caSChengwen Fengthe following two modes are supported (take above ``--bbb`` as an example):
115e3e579f5SChengwen Feng
116*51a639caSChengwen Feng- The kv mode: ``--bbb=1234`` or ``-b=1234``.
117e3e579f5SChengwen Feng
118*51a639caSChengwen Feng- The split mode: ``--bbb 1234`` or ``-b 1234``.
119e3e579f5SChengwen Feng
120e3e579f5SChengwen FengFor optional arguments which take optional-value,
121*51a639caSChengwen Fengthe following two modes are supported (take above ``--ccc`` as an example):
122e3e579f5SChengwen Feng
123*51a639caSChengwen Feng- The single mode: ``--ccc`` or ``-c``.
124e3e579f5SChengwen Feng
125*51a639caSChengwen Feng- The kv mode: ``--ccc=123`` or ``-c=123``.
126e3e579f5SChengwen Feng
127e3e579f5SChengwen FengFor positional arguments which must take required-value,
128e3e579f5SChengwen Fengtheir values are parsing in the order defined.
129e3e579f5SChengwen Feng
130e3e579f5SChengwen Feng.. note::
131e3e579f5SChengwen Feng
132e3e579f5SChengwen Feng   The compact mode is not supported.
133*51a639caSChengwen Feng   Take above ``-a`` and ``-d`` as an example, don't support ``-ad`` input.
134e3e579f5SChengwen Feng
135e3e579f5SChengwen FengParsing by autosave way
136e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~
137e3e579f5SChengwen Feng
138e3e579f5SChengwen FengArgument of known value type (e.g. ``RTE_ARGPARSE_ARG_VALUE_INT``)
139e3e579f5SChengwen Fengcould be parsed using this autosave way,
140e3e579f5SChengwen Fengand its result will save in the ``val_saver`` field.
141e3e579f5SChengwen Feng
142*51a639caSChengwen FengIn the above example, the arguments ``--aaa``/``--bbb``/``--ccc`` and ``ooo``
143e3e579f5SChengwen Fengboth use this way, the parsing is as follows:
144e3e579f5SChengwen Feng
145*51a639caSChengwen Feng- For argument ``--aaa``, it is configured as no-value,
146e3e579f5SChengwen Feng  so the ``aaa_val`` will be set to ``val_set`` field
147e3e579f5SChengwen Feng  which is 100 in the above example.
148e3e579f5SChengwen Feng
149*51a639caSChengwen Feng- For argument ``--bbb``, it is configured as required-value,
150e3e579f5SChengwen Feng  so the ``bbb_val`` will be set to user input's value
151*51a639caSChengwen Feng  (e.g. will be set to 1234 with input ``--bbb 1234``).
152e3e579f5SChengwen Feng
153*51a639caSChengwen Feng- For argument ``--ccc``, it is configured as optional-value,
154*51a639caSChengwen Feng  if user only input ``--ccc`` then the ``ccc_val`` will be set to ``val_set``
155*51a639caSChengwen Feng  field which is 200 in the above example;
156*51a639caSChengwen Feng  if user input ``--ccc=123``, then the ``ccc_val`` will be set to 123.
157e3e579f5SChengwen Feng
158*51a639caSChengwen Feng- For argument ``ooo``, it is positional argument,
159e3e579f5SChengwen Feng  the ``ooo_val`` will be set to user input's value.
160e3e579f5SChengwen Feng
161e3e579f5SChengwen FengParsing by callback way
162e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~
163e3e579f5SChengwen Feng
164e3e579f5SChengwen FengIt could also choose to use callback to parse,
165e3e579f5SChengwen Fengjust define a unique index for the argument
166e3e579f5SChengwen Fengand make the ``val_save`` field to be NULL also zero value-type.
167e3e579f5SChengwen Feng
168*51a639caSChengwen FengIn the above example, the arguments ``--ddd``/``--eee``/``--fff`` and ``ppp``
169*51a639caSChengwen Fengboth use this way.
170e3e579f5SChengwen Feng
171e3e579f5SChengwen FengMultiple times argument
172e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~
173e3e579f5SChengwen Feng
174e3e579f5SChengwen FengIf want to support the ability to enter the same argument multiple times,
175e3e579f5SChengwen Fengthen should mark ``RTE_ARGPARSE_ARG_SUPPORT_MULTI`` in the ``flags`` field.
176e3e579f5SChengwen FengFor example:
177e3e579f5SChengwen Feng
178e3e579f5SChengwen Feng.. code-block:: C
179e3e579f5SChengwen Feng
180e3e579f5SChengwen Feng   { "--xyz", "-x", "xyz argument", NULL, (void *)10, RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_SUPPORT_MULTI },
181e3e579f5SChengwen Feng
182*51a639caSChengwen FengThen the user input could contain multiple ``--xyz`` arguments.
183e3e579f5SChengwen Feng
184e3e579f5SChengwen Feng.. note::
185e3e579f5SChengwen Feng
186e3e579f5SChengwen Feng   The multiple times argument only support with optional argument
187e3e579f5SChengwen Feng   and must be parsed by callback way.
188