xref: /aosp_15_r20/external/openthread/src/cli/cli_utils.hpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2021, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker /**
30*cfb92d14SAndroid Build Coastguard Worker  * @file
31*cfb92d14SAndroid Build Coastguard Worker  *   This file contains definitions for the CLI util functions.
32*cfb92d14SAndroid Build Coastguard Worker  */
33*cfb92d14SAndroid Build Coastguard Worker 
34*cfb92d14SAndroid Build Coastguard Worker #ifndef CLI_UTILS_HPP_
35*cfb92d14SAndroid Build Coastguard Worker #define CLI_UTILS_HPP_
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker #include "openthread-core-config.h"
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker #include <stdarg.h>
40*cfb92d14SAndroid Build Coastguard Worker 
41*cfb92d14SAndroid Build Coastguard Worker #include <openthread/border_router.h>
42*cfb92d14SAndroid Build Coastguard Worker #include <openthread/border_routing.h>
43*cfb92d14SAndroid Build Coastguard Worker #include <openthread/cli.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <openthread/joiner.h>
45*cfb92d14SAndroid Build Coastguard Worker #include <openthread/thread.h>
46*cfb92d14SAndroid Build Coastguard Worker 
47*cfb92d14SAndroid Build Coastguard Worker #include "cli_config.h"
48*cfb92d14SAndroid Build Coastguard Worker 
49*cfb92d14SAndroid Build Coastguard Worker #include "common/binary_search.hpp"
50*cfb92d14SAndroid Build Coastguard Worker #include "common/num_utils.hpp"
51*cfb92d14SAndroid Build Coastguard Worker #include "common/string.hpp"
52*cfb92d14SAndroid Build Coastguard Worker #include "common/type_traits.hpp"
53*cfb92d14SAndroid Build Coastguard Worker #include "utils/parse_cmdline.hpp"
54*cfb92d14SAndroid Build Coastguard Worker 
55*cfb92d14SAndroid Build Coastguard Worker namespace ot {
56*cfb92d14SAndroid Build Coastguard Worker namespace Cli {
57*cfb92d14SAndroid Build Coastguard Worker 
58*cfb92d14SAndroid Build Coastguard Worker /**
59*cfb92d14SAndroid Build Coastguard Worker  * Represents a ID number value associated with a CLI command string.
60*cfb92d14SAndroid Build Coastguard Worker  *
61*cfb92d14SAndroid Build Coastguard Worker  */
62*cfb92d14SAndroid Build Coastguard Worker typedef uint64_t CommandId;
63*cfb92d14SAndroid Build Coastguard Worker 
64*cfb92d14SAndroid Build Coastguard Worker /**
65*cfb92d14SAndroid Build Coastguard Worker  * This `constexpr` function converts a CLI command string to its associated `CommandId` value.
66*cfb92d14SAndroid Build Coastguard Worker  *
67*cfb92d14SAndroid Build Coastguard Worker  * @param[in] aString   The CLI command string.
68*cfb92d14SAndroid Build Coastguard Worker  *
69*cfb92d14SAndroid Build Coastguard Worker  * @returns The associated `CommandId` with @p aString.
70*cfb92d14SAndroid Build Coastguard Worker  *
71*cfb92d14SAndroid Build Coastguard Worker  */
Cmd(const char * aString)72*cfb92d14SAndroid Build Coastguard Worker constexpr static CommandId Cmd(const char *aString)
73*cfb92d14SAndroid Build Coastguard Worker {
74*cfb92d14SAndroid Build Coastguard Worker     return (aString[0] == '\0') ? 0 : (static_cast<uint8_t>(aString[0]) + Cmd(aString + 1) * 255u);
75*cfb92d14SAndroid Build Coastguard Worker }
76*cfb92d14SAndroid Build Coastguard Worker 
77*cfb92d14SAndroid Build Coastguard Worker class Utils;
78*cfb92d14SAndroid Build Coastguard Worker 
79*cfb92d14SAndroid Build Coastguard Worker /**
80*cfb92d14SAndroid Build Coastguard Worker  * Implements the basic output functions.
81*cfb92d14SAndroid Build Coastguard Worker  *
82*cfb92d14SAndroid Build Coastguard Worker  */
83*cfb92d14SAndroid Build Coastguard Worker class OutputImplementer
84*cfb92d14SAndroid Build Coastguard Worker {
85*cfb92d14SAndroid Build Coastguard Worker     friend class Utils;
86*cfb92d14SAndroid Build Coastguard Worker 
87*cfb92d14SAndroid Build Coastguard Worker public:
88*cfb92d14SAndroid Build Coastguard Worker     /**
89*cfb92d14SAndroid Build Coastguard Worker      * Initializes the `OutputImplementer` object.
90*cfb92d14SAndroid Build Coastguard Worker      *
91*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aCallback           A pointer to an `otCliOutputCallback` to deliver strings to the CLI console.
92*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aCallbackContext    An arbitrary context to pass in when invoking @p aCallback.
93*cfb92d14SAndroid Build Coastguard Worker      *
94*cfb92d14SAndroid Build Coastguard Worker      */
95*cfb92d14SAndroid Build Coastguard Worker     OutputImplementer(otCliOutputCallback aCallback, void *aCallbackContext);
96*cfb92d14SAndroid Build Coastguard Worker 
97*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CLI_LOG_INPUT_OUTPUT_ENABLE
SetEmittingCommandOutput(bool aEmittingOutput)98*cfb92d14SAndroid Build Coastguard Worker     void SetEmittingCommandOutput(bool aEmittingOutput) { mEmittingCommandOutput = aEmittingOutput; }
99*cfb92d14SAndroid Build Coastguard Worker #else
SetEmittingCommandOutput(bool)100*cfb92d14SAndroid Build Coastguard Worker     void SetEmittingCommandOutput(bool) {}
101*cfb92d14SAndroid Build Coastguard Worker #endif
102*cfb92d14SAndroid Build Coastguard Worker 
103*cfb92d14SAndroid Build Coastguard Worker private:
104*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kInputOutputLogStringSize = OPENTHREAD_CONFIG_CLI_LOG_INPUT_OUTPUT_LOG_STRING_SIZE;
105*cfb92d14SAndroid Build Coastguard Worker 
106*cfb92d14SAndroid Build Coastguard Worker     void OutputV(const char *aFormat, va_list aArguments);
107*cfb92d14SAndroid Build Coastguard Worker 
108*cfb92d14SAndroid Build Coastguard Worker     otCliOutputCallback mCallback;
109*cfb92d14SAndroid Build Coastguard Worker     void               *mCallbackContext;
110*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CLI_LOG_INPUT_OUTPUT_ENABLE
111*cfb92d14SAndroid Build Coastguard Worker     char     mOutputString[kInputOutputLogStringSize];
112*cfb92d14SAndroid Build Coastguard Worker     uint16_t mOutputLength;
113*cfb92d14SAndroid Build Coastguard Worker     bool     mEmittingCommandOutput;
114*cfb92d14SAndroid Build Coastguard Worker #endif
115*cfb92d14SAndroid Build Coastguard Worker };
116*cfb92d14SAndroid Build Coastguard Worker 
117*cfb92d14SAndroid Build Coastguard Worker /**
118*cfb92d14SAndroid Build Coastguard Worker  * Provides CLI helper methods.
119*cfb92d14SAndroid Build Coastguard Worker  *
120*cfb92d14SAndroid Build Coastguard Worker  */
121*cfb92d14SAndroid Build Coastguard Worker class Utils
122*cfb92d14SAndroid Build Coastguard Worker {
123*cfb92d14SAndroid Build Coastguard Worker public:
124*cfb92d14SAndroid Build Coastguard Worker     typedef ot::Utils::CmdLineParser::Arg Arg; ///< An argument
125*cfb92d14SAndroid Build Coastguard Worker 
126*cfb92d14SAndroid Build Coastguard Worker     /**
127*cfb92d14SAndroid Build Coastguard Worker      * Represent a CLI command table entry, mapping a command with `aName` to a handler method.
128*cfb92d14SAndroid Build Coastguard Worker      *
129*cfb92d14SAndroid Build Coastguard Worker      * @tparam Cli    The CLI module type.
130*cfb92d14SAndroid Build Coastguard Worker      *
131*cfb92d14SAndroid Build Coastguard Worker      */
132*cfb92d14SAndroid Build Coastguard Worker     template <typename Cli> struct CommandEntry
133*cfb92d14SAndroid Build Coastguard Worker     {
134*cfb92d14SAndroid Build Coastguard Worker         typedef otError (Cli::*Handler)(Arg aArgs[]); ///< The handler method pointer type.
135*cfb92d14SAndroid Build Coastguard Worker 
136*cfb92d14SAndroid Build Coastguard Worker         /**
137*cfb92d14SAndroid Build Coastguard Worker          * Compares the entry's name with a given name.
138*cfb92d14SAndroid Build Coastguard Worker          *
139*cfb92d14SAndroid Build Coastguard Worker          * @param aName    The name string to compare with.
140*cfb92d14SAndroid Build Coastguard Worker          *
141*cfb92d14SAndroid Build Coastguard Worker          * @return zero means perfect match, positive (> 0) indicates @p aName is larger than entry's name, and
142*cfb92d14SAndroid Build Coastguard Worker          *         negative (< 0) indicates @p aName is smaller than entry's name.
143*cfb92d14SAndroid Build Coastguard Worker          *
144*cfb92d14SAndroid Build Coastguard Worker          */
Compareot::Cli::Utils::CommandEntry145*cfb92d14SAndroid Build Coastguard Worker         int Compare(const char *aName) const { return strcmp(aName, mName); }
146*cfb92d14SAndroid Build Coastguard Worker 
147*cfb92d14SAndroid Build Coastguard Worker         /**
148*cfb92d14SAndroid Build Coastguard Worker          * This `constexpr` method compares two entries to check if they are in order.
149*cfb92d14SAndroid Build Coastguard Worker          *
150*cfb92d14SAndroid Build Coastguard Worker          * @param[in] aFirst     The first entry.
151*cfb92d14SAndroid Build Coastguard Worker          * @param[in] aSecond    The second entry.
152*cfb92d14SAndroid Build Coastguard Worker          *
153*cfb92d14SAndroid Build Coastguard Worker          * @retval TRUE  if @p aFirst and @p aSecond are in order, i.e. `aFirst < aSecond`.
154*cfb92d14SAndroid Build Coastguard Worker          * @retval FALSE if @p aFirst and @p aSecond are not in order, i.e. `aFirst >= aSecond`.
155*cfb92d14SAndroid Build Coastguard Worker          *
156*cfb92d14SAndroid Build Coastguard Worker          */
AreInOrderot::Cli::Utils::CommandEntry157*cfb92d14SAndroid Build Coastguard Worker         constexpr static bool AreInOrder(const CommandEntry &aFirst, const CommandEntry &aSecond)
158*cfb92d14SAndroid Build Coastguard Worker         {
159*cfb92d14SAndroid Build Coastguard Worker             return AreStringsInOrder(aFirst.mName, aSecond.mName);
160*cfb92d14SAndroid Build Coastguard Worker         }
161*cfb92d14SAndroid Build Coastguard Worker 
162*cfb92d14SAndroid Build Coastguard Worker         const char *mName;    ///< The command name.
163*cfb92d14SAndroid Build Coastguard Worker         Handler     mHandler; ///< The handler method pointer.
164*cfb92d14SAndroid Build Coastguard Worker     };
165*cfb92d14SAndroid Build Coastguard Worker 
166*cfb92d14SAndroid Build Coastguard Worker     static const char kUnknownString[]; // Constant string "unknown".
167*cfb92d14SAndroid Build Coastguard Worker 
168*cfb92d14SAndroid Build Coastguard Worker     /**
169*cfb92d14SAndroid Build Coastguard Worker      * This template static method converts an enumeration value to a string using a table array.
170*cfb92d14SAndroid Build Coastguard Worker      *
171*cfb92d14SAndroid Build Coastguard Worker      * @tparam EnumType       The `enum` type.
172*cfb92d14SAndroid Build Coastguard Worker      * @tparam kLength        The table array length (number of entries in the array).
173*cfb92d14SAndroid Build Coastguard Worker      *
174*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aEnum       The enumeration value to convert (MUST be of `EnumType`).
175*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aTable      A reference to the array of strings of length @p kLength. `aTable[e]` is the string
176*cfb92d14SAndroid Build Coastguard Worker      *                        representation of enumeration value `e`.
177*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aNotFound   The string to return if the @p aEnum is not in the @p aTable.
178*cfb92d14SAndroid Build Coastguard Worker      *
179*cfb92d14SAndroid Build Coastguard Worker      * @returns The string representation of @p aEnum from @p aTable, or @p aNotFound if it is not in the table.
180*cfb92d14SAndroid Build Coastguard Worker      *
181*cfb92d14SAndroid Build Coastguard Worker      */
182*cfb92d14SAndroid Build Coastguard Worker     template <typename EnumType, uint16_t kLength>
Stringify(EnumType aEnum,const char * const (& aTable)[kLength],const char * aNotFound=kUnknownString)183*cfb92d14SAndroid Build Coastguard Worker     static const char *Stringify(EnumType aEnum,
184*cfb92d14SAndroid Build Coastguard Worker                                  const char *const (&aTable)[kLength],
185*cfb92d14SAndroid Build Coastguard Worker                                  const char *aNotFound = kUnknownString)
186*cfb92d14SAndroid Build Coastguard Worker     {
187*cfb92d14SAndroid Build Coastguard Worker         return (static_cast<uint16_t>(aEnum) < kLength) ? aTable[static_cast<uint16_t>(aEnum)] : aNotFound;
188*cfb92d14SAndroid Build Coastguard Worker     }
189*cfb92d14SAndroid Build Coastguard Worker 
190*cfb92d14SAndroid Build Coastguard Worker     /**
191*cfb92d14SAndroid Build Coastguard Worker      * Initializes the `Utils` object.
192*cfb92d14SAndroid Build Coastguard Worker      *
193*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aInstance           A pointer to OpenThread instance.
194*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aImplementer        An `OutputImplementer`.
195*cfb92d14SAndroid Build Coastguard Worker      *
196*cfb92d14SAndroid Build Coastguard Worker      */
Utils(otInstance * aInstance,OutputImplementer & aImplementer)197*cfb92d14SAndroid Build Coastguard Worker     Utils(otInstance *aInstance, OutputImplementer &aImplementer)
198*cfb92d14SAndroid Build Coastguard Worker         : mInstance(aInstance)
199*cfb92d14SAndroid Build Coastguard Worker         , mImplementer(aImplementer)
200*cfb92d14SAndroid Build Coastguard Worker     {
201*cfb92d14SAndroid Build Coastguard Worker     }
202*cfb92d14SAndroid Build Coastguard Worker 
203*cfb92d14SAndroid Build Coastguard Worker     /**
204*cfb92d14SAndroid Build Coastguard Worker      * Returns the pointer to OpenThread instance.
205*cfb92d14SAndroid Build Coastguard Worker      *
206*cfb92d14SAndroid Build Coastguard Worker      * @returns The pointer to the OpenThread instance.
207*cfb92d14SAndroid Build Coastguard Worker      *
208*cfb92d14SAndroid Build Coastguard Worker      */
GetInstancePtr(void)209*cfb92d14SAndroid Build Coastguard Worker     otInstance *GetInstancePtr(void) { return mInstance; }
210*cfb92d14SAndroid Build Coastguard Worker 
211*cfb92d14SAndroid Build Coastguard Worker     /**
212*cfb92d14SAndroid Build Coastguard Worker      * Represents a buffer which is used when converting a `uint64` value to string in decimal format.
213*cfb92d14SAndroid Build Coastguard Worker      *
214*cfb92d14SAndroid Build Coastguard Worker      */
215*cfb92d14SAndroid Build Coastguard Worker     struct Uint64StringBuffer
216*cfb92d14SAndroid Build Coastguard Worker     {
217*cfb92d14SAndroid Build Coastguard Worker         static constexpr uint16_t kSize = 21; ///< Size of a buffer
218*cfb92d14SAndroid Build Coastguard Worker 
219*cfb92d14SAndroid Build Coastguard Worker         char mChars[kSize]; ///< Char array (do not access the array directly).
220*cfb92d14SAndroid Build Coastguard Worker     };
221*cfb92d14SAndroid Build Coastguard Worker 
222*cfb92d14SAndroid Build Coastguard Worker     /**
223*cfb92d14SAndroid Build Coastguard Worker      * Converts a `uint64_t` value to a decimal format string.
224*cfb92d14SAndroid Build Coastguard Worker      *
225*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aUint64  The `uint64_t` value to convert.
226*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aBuffer  A buffer to allocate the string from.
227*cfb92d14SAndroid Build Coastguard Worker      *
228*cfb92d14SAndroid Build Coastguard Worker      * @returns A pointer to the start of the string (null-terminated) representation of @p aUint64.
229*cfb92d14SAndroid Build Coastguard Worker      *
230*cfb92d14SAndroid Build Coastguard Worker      */
231*cfb92d14SAndroid Build Coastguard Worker     static const char *Uint64ToString(uint64_t aUint64, Uint64StringBuffer &aBuffer);
232*cfb92d14SAndroid Build Coastguard Worker 
233*cfb92d14SAndroid Build Coastguard Worker     /**
234*cfb92d14SAndroid Build Coastguard Worker      * Delivers a formatted output string to the CLI console.
235*cfb92d14SAndroid Build Coastguard Worker      *
236*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aFormat  A pointer to the format string.
237*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  ...      A variable list of arguments to format.
238*cfb92d14SAndroid Build Coastguard Worker      *
239*cfb92d14SAndroid Build Coastguard Worker      */
240*cfb92d14SAndroid Build Coastguard Worker     void OutputFormat(const char *aFormat, ...) OT_TOOL_PRINTF_STYLE_FORMAT_ARG_CHECK(2, 3);
241*cfb92d14SAndroid Build Coastguard Worker 
242*cfb92d14SAndroid Build Coastguard Worker     /**
243*cfb92d14SAndroid Build Coastguard Worker      * Delivers a formatted output string to the CLI console (to which it prepends a given number
244*cfb92d14SAndroid Build Coastguard Worker      * indentation space chars).
245*cfb92d14SAndroid Build Coastguard Worker      *
246*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aIndentSize   Number of indentation space chars to prepend to the string.
247*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aFormat       A pointer to the format string.
248*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  ...           A variable list of arguments to format.
249*cfb92d14SAndroid Build Coastguard Worker      *
250*cfb92d14SAndroid Build Coastguard Worker      */
251*cfb92d14SAndroid Build Coastguard Worker     void OutputFormat(uint8_t aIndentSize, const char *aFormat, ...) OT_TOOL_PRINTF_STYLE_FORMAT_ARG_CHECK(3, 4);
252*cfb92d14SAndroid Build Coastguard Worker 
253*cfb92d14SAndroid Build Coastguard Worker     /**
254*cfb92d14SAndroid Build Coastguard Worker      * Delivers a formatted output string to the CLI console (to which it also appends newline "\r\n").
255*cfb92d14SAndroid Build Coastguard Worker      *
256*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aFormat  A pointer to the format string.
257*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  ...      A variable list of arguments to format.
258*cfb92d14SAndroid Build Coastguard Worker      *
259*cfb92d14SAndroid Build Coastguard Worker      */
260*cfb92d14SAndroid Build Coastguard Worker     void OutputLine(const char *aFormat, ...) OT_TOOL_PRINTF_STYLE_FORMAT_ARG_CHECK(2, 3);
261*cfb92d14SAndroid Build Coastguard Worker 
262*cfb92d14SAndroid Build Coastguard Worker     /**
263*cfb92d14SAndroid Build Coastguard Worker      * Delivers a formatted output string to the CLI console (to which it prepends a given number
264*cfb92d14SAndroid Build Coastguard Worker      * indentation space chars and appends newline "\r\n").
265*cfb92d14SAndroid Build Coastguard Worker      *
266*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aIndentSize   Number of indentation space chars to prepend to the string.
267*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aFormat       A pointer to the format string.
268*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  ...           A variable list of arguments to format.
269*cfb92d14SAndroid Build Coastguard Worker      *
270*cfb92d14SAndroid Build Coastguard Worker      */
271*cfb92d14SAndroid Build Coastguard Worker     void OutputLine(uint8_t aIndentSize, const char *aFormat, ...) OT_TOOL_PRINTF_STYLE_FORMAT_ARG_CHECK(3, 4);
272*cfb92d14SAndroid Build Coastguard Worker 
273*cfb92d14SAndroid Build Coastguard Worker     /**
274*cfb92d14SAndroid Build Coastguard Worker      * Delivered newline "\r\n" to the CLI console.
275*cfb92d14SAndroid Build Coastguard Worker      *
276*cfb92d14SAndroid Build Coastguard Worker      */
277*cfb92d14SAndroid Build Coastguard Worker     void OutputNewLine(void);
278*cfb92d14SAndroid Build Coastguard Worker 
279*cfb92d14SAndroid Build Coastguard Worker     /**
280*cfb92d14SAndroid Build Coastguard Worker      * Outputs a given number of space chars to the CLI console.
281*cfb92d14SAndroid Build Coastguard Worker      *
282*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aCount  Number of space chars to output.
283*cfb92d14SAndroid Build Coastguard Worker      *
284*cfb92d14SAndroid Build Coastguard Worker      */
285*cfb92d14SAndroid Build Coastguard Worker     void OutputSpaces(uint8_t aCount);
286*cfb92d14SAndroid Build Coastguard Worker 
287*cfb92d14SAndroid Build Coastguard Worker     /**
288*cfb92d14SAndroid Build Coastguard Worker      * Outputs a number of bytes to the CLI console as a hex string.
289*cfb92d14SAndroid Build Coastguard Worker      *
290*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aBytes   A pointer to data which should be printed.
291*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aLength  @p aBytes length.
292*cfb92d14SAndroid Build Coastguard Worker      *
293*cfb92d14SAndroid Build Coastguard Worker      */
294*cfb92d14SAndroid Build Coastguard Worker     void OutputBytes(const uint8_t *aBytes, uint16_t aLength);
295*cfb92d14SAndroid Build Coastguard Worker 
296*cfb92d14SAndroid Build Coastguard Worker     /**
297*cfb92d14SAndroid Build Coastguard Worker      * Outputs a number of bytes to the CLI console as a hex string and at the end it also outputs newline
298*cfb92d14SAndroid Build Coastguard Worker      * "\r\n".
299*cfb92d14SAndroid Build Coastguard Worker      *
300*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aBytes   A pointer to data which should be printed.
301*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aLength  @p aBytes length.
302*cfb92d14SAndroid Build Coastguard Worker      *
303*cfb92d14SAndroid Build Coastguard Worker      */
304*cfb92d14SAndroid Build Coastguard Worker     void OutputBytesLine(const uint8_t *aBytes, uint16_t aLength);
305*cfb92d14SAndroid Build Coastguard Worker 
306*cfb92d14SAndroid Build Coastguard Worker     /**
307*cfb92d14SAndroid Build Coastguard Worker      * Outputs a number of bytes to the CLI console as a hex string.
308*cfb92d14SAndroid Build Coastguard Worker      *
309*cfb92d14SAndroid Build Coastguard Worker      * @tparam kBytesLength   The length of @p aBytes array.
310*cfb92d14SAndroid Build Coastguard Worker      *
311*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aBytes     A array of @p kBytesLength bytes which should be printed.
312*cfb92d14SAndroid Build Coastguard Worker      *
313*cfb92d14SAndroid Build Coastguard Worker      */
OutputBytes(const uint8_t (& aBytes)[kBytesLength])314*cfb92d14SAndroid Build Coastguard Worker     template <uint8_t kBytesLength> void OutputBytes(const uint8_t (&aBytes)[kBytesLength])
315*cfb92d14SAndroid Build Coastguard Worker     {
316*cfb92d14SAndroid Build Coastguard Worker         OutputBytes(aBytes, kBytesLength);
317*cfb92d14SAndroid Build Coastguard Worker     }
318*cfb92d14SAndroid Build Coastguard Worker 
319*cfb92d14SAndroid Build Coastguard Worker     /**
320*cfb92d14SAndroid Build Coastguard Worker      * Outputs a number of bytes to the CLI console as a hex string and at the end it also outputs newline
321*cfb92d14SAndroid Build Coastguard Worker      * "\r\n".
322*cfb92d14SAndroid Build Coastguard Worker      *
323*cfb92d14SAndroid Build Coastguard Worker      * @tparam kBytesLength   The length of @p aBytes array.
324*cfb92d14SAndroid Build Coastguard Worker      *
325*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aBytes     A array of @p kBytesLength bytes which should be printed.
326*cfb92d14SAndroid Build Coastguard Worker      *
327*cfb92d14SAndroid Build Coastguard Worker      */
OutputBytesLine(const uint8_t (& aBytes)[kBytesLength])328*cfb92d14SAndroid Build Coastguard Worker     template <uint8_t kBytesLength> void OutputBytesLine(const uint8_t (&aBytes)[kBytesLength])
329*cfb92d14SAndroid Build Coastguard Worker     {
330*cfb92d14SAndroid Build Coastguard Worker         OutputBytesLine(aBytes, kBytesLength);
331*cfb92d14SAndroid Build Coastguard Worker     }
332*cfb92d14SAndroid Build Coastguard Worker 
333*cfb92d14SAndroid Build Coastguard Worker     /**
334*cfb92d14SAndroid Build Coastguard Worker      * Outputs an Extended MAC Address to the CLI console.
335*cfb92d14SAndroid Build Coastguard Worker      *
336*cfb92d14SAndroid Build Coastguard Worker      * param[in] aExtAddress  The Extended MAC Address to output.
337*cfb92d14SAndroid Build Coastguard Worker      *
338*cfb92d14SAndroid Build Coastguard Worker      */
OutputExtAddress(const otExtAddress & aExtAddress)339*cfb92d14SAndroid Build Coastguard Worker     void OutputExtAddress(const otExtAddress &aExtAddress) { OutputBytes(aExtAddress.m8); }
340*cfb92d14SAndroid Build Coastguard Worker 
341*cfb92d14SAndroid Build Coastguard Worker     /**
342*cfb92d14SAndroid Build Coastguard Worker      * Outputs an Extended MAC Address to the CLI console and at the end it also outputs newline "\r\n".
343*cfb92d14SAndroid Build Coastguard Worker      *
344*cfb92d14SAndroid Build Coastguard Worker      * param[in] aExtAddress  The Extended MAC Address to output.
345*cfb92d14SAndroid Build Coastguard Worker      *
346*cfb92d14SAndroid Build Coastguard Worker      */
OutputExtAddressLine(const otExtAddress & aExtAddress)347*cfb92d14SAndroid Build Coastguard Worker     void OutputExtAddressLine(const otExtAddress &aExtAddress) { OutputBytesLine(aExtAddress.m8); }
348*cfb92d14SAndroid Build Coastguard Worker 
349*cfb92d14SAndroid Build Coastguard Worker     /**
350*cfb92d14SAndroid Build Coastguard Worker      * Outputs a `uint64_t` value in decimal format.
351*cfb92d14SAndroid Build Coastguard Worker      *
352*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aUint64   The `uint64_t` value to output.
353*cfb92d14SAndroid Build Coastguard Worker      *
354*cfb92d14SAndroid Build Coastguard Worker      */
355*cfb92d14SAndroid Build Coastguard Worker     void OutputUint64(uint64_t aUint64);
356*cfb92d14SAndroid Build Coastguard Worker 
357*cfb92d14SAndroid Build Coastguard Worker     /**
358*cfb92d14SAndroid Build Coastguard Worker      * Outputs a `uint64_t` value in decimal format and at the end it also outputs newline "\r\n".
359*cfb92d14SAndroid Build Coastguard Worker      *
360*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aUint64   The `uint64_t` value to output.
361*cfb92d14SAndroid Build Coastguard Worker      *
362*cfb92d14SAndroid Build Coastguard Worker      */
363*cfb92d14SAndroid Build Coastguard Worker     void OutputUint64Line(uint64_t aUint64);
364*cfb92d14SAndroid Build Coastguard Worker 
365*cfb92d14SAndroid Build Coastguard Worker     /**
366*cfb92d14SAndroid Build Coastguard Worker      * Outputs "Enabled" or "Disabled" status to the CLI console (it also appends newline "\r\n").
367*cfb92d14SAndroid Build Coastguard Worker      *
368*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aEnabled  A boolean indicating the status. TRUE outputs "Enabled", FALSE outputs "Disabled".
369*cfb92d14SAndroid Build Coastguard Worker      *
370*cfb92d14SAndroid Build Coastguard Worker      */
371*cfb92d14SAndroid Build Coastguard Worker     void OutputEnabledDisabledStatus(bool aEnabled);
372*cfb92d14SAndroid Build Coastguard Worker 
373*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
374*cfb92d14SAndroid Build Coastguard Worker 
375*cfb92d14SAndroid Build Coastguard Worker     /**
376*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 address to the CLI console.
377*cfb92d14SAndroid Build Coastguard Worker      *
378*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aAddress  A reference to the IPv6 address.
379*cfb92d14SAndroid Build Coastguard Worker      *
380*cfb92d14SAndroid Build Coastguard Worker      */
381*cfb92d14SAndroid Build Coastguard Worker     void OutputIp6Address(const otIp6Address &aAddress);
382*cfb92d14SAndroid Build Coastguard Worker 
383*cfb92d14SAndroid Build Coastguard Worker     /**
384*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 address to the CLI console and at the end it also outputs newline "\r\n".
385*cfb92d14SAndroid Build Coastguard Worker      *
386*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aAddress  A reference to the IPv6 address.
387*cfb92d14SAndroid Build Coastguard Worker      *
388*cfb92d14SAndroid Build Coastguard Worker      */
389*cfb92d14SAndroid Build Coastguard Worker     void OutputIp6AddressLine(const otIp6Address &aAddress);
390*cfb92d14SAndroid Build Coastguard Worker 
391*cfb92d14SAndroid Build Coastguard Worker     /**
392*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 prefix to the CLI console.
393*cfb92d14SAndroid Build Coastguard Worker      *
394*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aPrefix  A reference to the IPv6 prefix.
395*cfb92d14SAndroid Build Coastguard Worker      *
396*cfb92d14SAndroid Build Coastguard Worker      */
397*cfb92d14SAndroid Build Coastguard Worker     void OutputIp6Prefix(const otIp6Prefix &aPrefix);
398*cfb92d14SAndroid Build Coastguard Worker 
399*cfb92d14SAndroid Build Coastguard Worker     /**
400*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 prefix to the CLI console and at the end it also outputs newline "\r\n".
401*cfb92d14SAndroid Build Coastguard Worker      *
402*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aPrefix  A reference to the IPv6 prefix.
403*cfb92d14SAndroid Build Coastguard Worker      *
404*cfb92d14SAndroid Build Coastguard Worker      */
405*cfb92d14SAndroid Build Coastguard Worker     void OutputIp6PrefixLine(const otIp6Prefix &aPrefix);
406*cfb92d14SAndroid Build Coastguard Worker 
407*cfb92d14SAndroid Build Coastguard Worker     /**
408*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 network prefix to the CLI console.
409*cfb92d14SAndroid Build Coastguard Worker      *
410*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aPrefix  A reference to the IPv6 network prefix.
411*cfb92d14SAndroid Build Coastguard Worker      *
412*cfb92d14SAndroid Build Coastguard Worker      */
413*cfb92d14SAndroid Build Coastguard Worker     void OutputIp6Prefix(const otIp6NetworkPrefix &aPrefix);
414*cfb92d14SAndroid Build Coastguard Worker 
415*cfb92d14SAndroid Build Coastguard Worker     /**
416*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 network prefix to the CLI console and at the end it also outputs newline "\r\n".
417*cfb92d14SAndroid Build Coastguard Worker      *
418*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aPrefix  A reference to the IPv6 network prefix.
419*cfb92d14SAndroid Build Coastguard Worker      *
420*cfb92d14SAndroid Build Coastguard Worker      */
421*cfb92d14SAndroid Build Coastguard Worker     void OutputIp6PrefixLine(const otIp6NetworkPrefix &aPrefix);
422*cfb92d14SAndroid Build Coastguard Worker 
423*cfb92d14SAndroid Build Coastguard Worker     /**
424*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 socket address to the CLI console.
425*cfb92d14SAndroid Build Coastguard Worker      *
426*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aSockAddr   A reference to the IPv6 socket address.
427*cfb92d14SAndroid Build Coastguard Worker      *
428*cfb92d14SAndroid Build Coastguard Worker      */
429*cfb92d14SAndroid Build Coastguard Worker     void OutputSockAddr(const otSockAddr &aSockAddr);
430*cfb92d14SAndroid Build Coastguard Worker 
431*cfb92d14SAndroid Build Coastguard Worker     /**
432*cfb92d14SAndroid Build Coastguard Worker      * Outputs an IPv6 socket address to the CLI console and at the end it also outputs newline "\r\n".
433*cfb92d14SAndroid Build Coastguard Worker      *
434*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aSockAddr   A reference to the IPv6 socket address.
435*cfb92d14SAndroid Build Coastguard Worker      *
436*cfb92d14SAndroid Build Coastguard Worker      */
437*cfb92d14SAndroid Build Coastguard Worker     void OutputSockAddrLine(const otSockAddr &aSockAddr);
438*cfb92d14SAndroid Build Coastguard Worker 
439*cfb92d14SAndroid Build Coastguard Worker     /**
440*cfb92d14SAndroid Build Coastguard Worker      * Outputs DNS TXT data to the CLI console.
441*cfb92d14SAndroid Build Coastguard Worker      *
442*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aTxtData        A pointer to a buffer containing the DNS TXT data.
443*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aTxtDataLength  The length of @p aTxtData (in bytes).
444*cfb92d14SAndroid Build Coastguard Worker      *
445*cfb92d14SAndroid Build Coastguard Worker      */
446*cfb92d14SAndroid Build Coastguard Worker     void OutputDnsTxtData(const uint8_t *aTxtData, uint16_t aTxtDataLength);
447*cfb92d14SAndroid Build Coastguard Worker 
448*cfb92d14SAndroid Build Coastguard Worker     /**
449*cfb92d14SAndroid Build Coastguard Worker      * Represents a buffer which is used when converting an encoded rate value to percentage string.
450*cfb92d14SAndroid Build Coastguard Worker      *
451*cfb92d14SAndroid Build Coastguard Worker      */
452*cfb92d14SAndroid Build Coastguard Worker     struct PercentageStringBuffer
453*cfb92d14SAndroid Build Coastguard Worker     {
454*cfb92d14SAndroid Build Coastguard Worker         static constexpr uint16_t kSize = 7; ///< Size of a buffer
455*cfb92d14SAndroid Build Coastguard Worker 
456*cfb92d14SAndroid Build Coastguard Worker         char mChars[kSize]; ///< Char array (do not access the array directly).
457*cfb92d14SAndroid Build Coastguard Worker     };
458*cfb92d14SAndroid Build Coastguard Worker 
459*cfb92d14SAndroid Build Coastguard Worker     /**
460*cfb92d14SAndroid Build Coastguard Worker      * Converts an encoded value to a percentage representation.
461*cfb92d14SAndroid Build Coastguard Worker      *
462*cfb92d14SAndroid Build Coastguard Worker      * The encoded @p aValue is assumed to be linearly scaled such that `0` maps to 0% and `0xffff` maps to 100%.
463*cfb92d14SAndroid Build Coastguard Worker      *
464*cfb92d14SAndroid Build Coastguard Worker      * The resulting string provides two decimal accuracy, e.g., "100.00", "0.00", "75.37".
465*cfb92d14SAndroid Build Coastguard Worker      *
466*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aValue   The encoded percentage value to convert.
467*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aBuffer  A buffer to allocate the string from.
468*cfb92d14SAndroid Build Coastguard Worker      *
469*cfb92d14SAndroid Build Coastguard Worker      * @returns A pointer to the start of the string (null-terminated) representation of @p aValue.
470*cfb92d14SAndroid Build Coastguard Worker      *
471*cfb92d14SAndroid Build Coastguard Worker      */
472*cfb92d14SAndroid Build Coastguard Worker     static const char *PercentageToString(uint16_t aValue, PercentageStringBuffer &aBuffer);
473*cfb92d14SAndroid Build Coastguard Worker 
474*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
475*cfb92d14SAndroid Build Coastguard Worker 
476*cfb92d14SAndroid Build Coastguard Worker     /**
477*cfb92d14SAndroid Build Coastguard Worker      * Outputs a table header to the CLI console.
478*cfb92d14SAndroid Build Coastguard Worker      *
479*cfb92d14SAndroid Build Coastguard Worker      * An example of the table header format:
480*cfb92d14SAndroid Build Coastguard Worker      *
481*cfb92d14SAndroid Build Coastguard Worker      *    | Title1    | Title2 |Title3| Title4               |
482*cfb92d14SAndroid Build Coastguard Worker      *    +-----------+--------+------+----------------------+
483*cfb92d14SAndroid Build Coastguard Worker      *
484*cfb92d14SAndroid Build Coastguard Worker      * The titles are left adjusted (extra white space is added at beginning if the column is width enough). The widths
485*cfb92d14SAndroid Build Coastguard Worker      * are specified as the number chars between two `|` chars (excluding the char `|` itself).
486*cfb92d14SAndroid Build Coastguard Worker      *
487*cfb92d14SAndroid Build Coastguard Worker      * @tparam kTableNumColumns   The number columns in the table.
488*cfb92d14SAndroid Build Coastguard Worker      *
489*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aTitles   An array specifying the table column titles.
490*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aWidths   An array specifying the table column widths (in number of chars).
491*cfb92d14SAndroid Build Coastguard Worker      *
492*cfb92d14SAndroid Build Coastguard Worker      */
493*cfb92d14SAndroid Build Coastguard Worker     template <uint8_t kTableNumColumns>
OutputTableHeader(const char * const (& aTitles)[kTableNumColumns],const uint8_t (& aWidths)[kTableNumColumns])494*cfb92d14SAndroid Build Coastguard Worker     void OutputTableHeader(const char *const (&aTitles)[kTableNumColumns], const uint8_t (&aWidths)[kTableNumColumns])
495*cfb92d14SAndroid Build Coastguard Worker     {
496*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kTableNumColumns, &aTitles[0], &aWidths[0]);
497*cfb92d14SAndroid Build Coastguard Worker     }
498*cfb92d14SAndroid Build Coastguard Worker 
499*cfb92d14SAndroid Build Coastguard Worker     /**
500*cfb92d14SAndroid Build Coastguard Worker      * Outputs a table separator to the CLI console.
501*cfb92d14SAndroid Build Coastguard Worker      *
502*cfb92d14SAndroid Build Coastguard Worker      * An example of the table separator:
503*cfb92d14SAndroid Build Coastguard Worker      *
504*cfb92d14SAndroid Build Coastguard Worker      *    +-----------+--------+------+----------------------+
505*cfb92d14SAndroid Build Coastguard Worker      *
506*cfb92d14SAndroid Build Coastguard Worker      * The widths are specified as number chars between two `+` chars (excluding the char `+` itself).
507*cfb92d14SAndroid Build Coastguard Worker      *
508*cfb92d14SAndroid Build Coastguard Worker      * @tparam kTableNumColumns   The number columns in the table.
509*cfb92d14SAndroid Build Coastguard Worker      *
510*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aWidths   An array specifying the table column widths (in number of chars).
511*cfb92d14SAndroid Build Coastguard Worker      *
512*cfb92d14SAndroid Build Coastguard Worker      */
OutputTableSeparator(const uint8_t (& aWidths)[kTableNumColumns])513*cfb92d14SAndroid Build Coastguard Worker     template <uint8_t kTableNumColumns> void OutputTableSeparator(const uint8_t (&aWidths)[kTableNumColumns])
514*cfb92d14SAndroid Build Coastguard Worker     {
515*cfb92d14SAndroid Build Coastguard Worker         OutputTableSeparator(kTableNumColumns, &aWidths[0]);
516*cfb92d14SAndroid Build Coastguard Worker     }
517*cfb92d14SAndroid Build Coastguard Worker 
518*cfb92d14SAndroid Build Coastguard Worker     /**
519*cfb92d14SAndroid Build Coastguard Worker      * Outputs the list of commands from a given command table.
520*cfb92d14SAndroid Build Coastguard Worker      *
521*cfb92d14SAndroid Build Coastguard Worker      * @tparam Cli      The CLI module type.
522*cfb92d14SAndroid Build Coastguard Worker      * @tparam kLength  The length of command table array.
523*cfb92d14SAndroid Build Coastguard Worker      *
524*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aCommandTable   The command table array.
525*cfb92d14SAndroid Build Coastguard Worker      *
526*cfb92d14SAndroid Build Coastguard Worker      */
OutputCommandTable(const CommandEntry<Cli> (& aCommandTable)[kLength])527*cfb92d14SAndroid Build Coastguard Worker     template <typename Cli, uint16_t kLength> void OutputCommandTable(const CommandEntry<Cli> (&aCommandTable)[kLength])
528*cfb92d14SAndroid Build Coastguard Worker     {
529*cfb92d14SAndroid Build Coastguard Worker         for (const CommandEntry<Cli> &entry : aCommandTable)
530*cfb92d14SAndroid Build Coastguard Worker         {
531*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%s", entry.mName);
532*cfb92d14SAndroid Build Coastguard Worker         }
533*cfb92d14SAndroid Build Coastguard Worker     }
534*cfb92d14SAndroid Build Coastguard Worker 
535*cfb92d14SAndroid Build Coastguard Worker     /**
536*cfb92d14SAndroid Build Coastguard Worker      * Clears (sets to zero) all bytes of a given object.
537*cfb92d14SAndroid Build Coastguard Worker      *
538*cfb92d14SAndroid Build Coastguard Worker      * @tparam ObjectType    The object type.
539*cfb92d14SAndroid Build Coastguard Worker      *
540*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aObject    A reference to the object of type `ObjectType` to clear all its bytes.
541*cfb92d14SAndroid Build Coastguard Worker      *
542*cfb92d14SAndroid Build Coastguard Worker      */
ClearAllBytes(ObjectType & aObject)543*cfb92d14SAndroid Build Coastguard Worker     template <typename ObjectType> static void ClearAllBytes(ObjectType &aObject)
544*cfb92d14SAndroid Build Coastguard Worker     {
545*cfb92d14SAndroid Build Coastguard Worker         static_assert(!TypeTraits::IsPointer<ObjectType>::kValue, "ObjectType must not be a pointer");
546*cfb92d14SAndroid Build Coastguard Worker 
547*cfb92d14SAndroid Build Coastguard Worker         memset(reinterpret_cast<void *>(&aObject), 0, sizeof(ObjectType));
548*cfb92d14SAndroid Build Coastguard Worker     }
549*cfb92d14SAndroid Build Coastguard Worker 
550*cfb92d14SAndroid Build Coastguard Worker     // Definitions of handlers to process Get/Set/Enable/Disable.
551*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> using GetHandler         = ValueType (&)(otInstance *);
552*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> using SetHandler         = void (&)(otInstance *, ValueType);
553*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> using SetHandlerFailable = otError (&)(otInstance *, ValueType);
554*cfb92d14SAndroid Build Coastguard Worker     using IsEnabledHandler                                 = bool (&)(otInstance *);
555*cfb92d14SAndroid Build Coastguard Worker     using SetEnabledHandler                                = void (&)(otInstance *, bool);
556*cfb92d14SAndroid Build Coastguard Worker     using SetEnabledHandlerFailable                        = otError (&)(otInstance *, bool);
557*cfb92d14SAndroid Build Coastguard Worker 
558*cfb92d14SAndroid Build Coastguard Worker     // Returns format string to output a `ValueType` (e.g., "%u" for `uint16_t`).
559*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> static constexpr const char *FormatStringFor(void);
560*cfb92d14SAndroid Build Coastguard Worker 
561*cfb92d14SAndroid Build Coastguard Worker     /**
562*cfb92d14SAndroid Build Coastguard Worker      * Checks a given argument string against "enable" or "disable" commands.
563*cfb92d14SAndroid Build Coastguard Worker      *
564*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aArg     The argument string to parse.
565*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aEnable  Boolean variable to return outcome on success.
566*cfb92d14SAndroid Build Coastguard Worker      *                      Set to TRUE for "enable" command, and FALSE for "disable" command.
567*cfb92d14SAndroid Build Coastguard Worker      *
568*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_NONE             Successfully parsed the @p aString and updated @p aEnable.
569*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_COMMAND  The @p aString is not "enable" or "disable" command.
570*cfb92d14SAndroid Build Coastguard Worker      *
571*cfb92d14SAndroid Build Coastguard Worker      */
572*cfb92d14SAndroid Build Coastguard Worker     static otError ParseEnableOrDisable(const Arg &aArg, bool &aEnable);
573*cfb92d14SAndroid Build Coastguard Worker 
574*cfb92d14SAndroid Build Coastguard Worker     // General template implementation.
575*cfb92d14SAndroid Build Coastguard Worker     // Specializations for `uint32_t` and `int32_t` are added at the end.
ProcessGet(Arg aArgs[],GetHandler<ValueType> aGetHandler)576*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> otError ProcessGet(Arg aArgs[], GetHandler<ValueType> aGetHandler)
577*cfb92d14SAndroid Build Coastguard Worker     {
578*cfb92d14SAndroid Build Coastguard Worker         static_assert(
579*cfb92d14SAndroid Build Coastguard Worker             TypeTraits::IsSame<ValueType, uint8_t>::kValue || TypeTraits::IsSame<ValueType, uint16_t>::kValue ||
580*cfb92d14SAndroid Build Coastguard Worker                 TypeTraits::IsSame<ValueType, int8_t>::kValue || TypeTraits::IsSame<ValueType, int16_t>::kValue ||
581*cfb92d14SAndroid Build Coastguard Worker                 TypeTraits::IsSame<ValueType, const char *>::kValue,
582*cfb92d14SAndroid Build Coastguard Worker             "ValueType must be an  8, 16 `int` or `uint` type, or a `const char *`");
583*cfb92d14SAndroid Build Coastguard Worker 
584*cfb92d14SAndroid Build Coastguard Worker         otError error = OT_ERROR_NONE;
585*cfb92d14SAndroid Build Coastguard Worker 
586*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
587*cfb92d14SAndroid Build Coastguard Worker         OutputLine(FormatStringFor<ValueType>(), aGetHandler(GetInstancePtr()));
588*cfb92d14SAndroid Build Coastguard Worker 
589*cfb92d14SAndroid Build Coastguard Worker     exit:
590*cfb92d14SAndroid Build Coastguard Worker         return error;
591*cfb92d14SAndroid Build Coastguard Worker     }
592*cfb92d14SAndroid Build Coastguard Worker 
ProcessSet(Arg aArgs[],SetHandler<ValueType> aSetHandler)593*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> otError ProcessSet(Arg aArgs[], SetHandler<ValueType> aSetHandler)
594*cfb92d14SAndroid Build Coastguard Worker     {
595*cfb92d14SAndroid Build Coastguard Worker         otError   error;
596*cfb92d14SAndroid Build Coastguard Worker         ValueType value;
597*cfb92d14SAndroid Build Coastguard Worker 
598*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAs<ValueType>(value));
599*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[1].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
600*cfb92d14SAndroid Build Coastguard Worker 
601*cfb92d14SAndroid Build Coastguard Worker         aSetHandler(GetInstancePtr(), value);
602*cfb92d14SAndroid Build Coastguard Worker 
603*cfb92d14SAndroid Build Coastguard Worker     exit:
604*cfb92d14SAndroid Build Coastguard Worker         return error;
605*cfb92d14SAndroid Build Coastguard Worker     }
606*cfb92d14SAndroid Build Coastguard Worker 
ProcessSet(Arg aArgs[],SetHandlerFailable<ValueType> aSetHandler)607*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType> otError ProcessSet(Arg aArgs[], SetHandlerFailable<ValueType> aSetHandler)
608*cfb92d14SAndroid Build Coastguard Worker     {
609*cfb92d14SAndroid Build Coastguard Worker         otError   error;
610*cfb92d14SAndroid Build Coastguard Worker         ValueType value;
611*cfb92d14SAndroid Build Coastguard Worker 
612*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAs<ValueType>(value));
613*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[1].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
614*cfb92d14SAndroid Build Coastguard Worker 
615*cfb92d14SAndroid Build Coastguard Worker         error = aSetHandler(GetInstancePtr(), value);
616*cfb92d14SAndroid Build Coastguard Worker 
617*cfb92d14SAndroid Build Coastguard Worker     exit:
618*cfb92d14SAndroid Build Coastguard Worker         return error;
619*cfb92d14SAndroid Build Coastguard Worker     }
620*cfb92d14SAndroid Build Coastguard Worker 
621*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType>
ProcessGetSet(Arg aArgs[],GetHandler<ValueType> aGetHandler,SetHandler<ValueType> aSetHandler)622*cfb92d14SAndroid Build Coastguard Worker     otError ProcessGetSet(Arg aArgs[], GetHandler<ValueType> aGetHandler, SetHandler<ValueType> aSetHandler)
623*cfb92d14SAndroid Build Coastguard Worker     {
624*cfb92d14SAndroid Build Coastguard Worker         otError error = ProcessGet(aArgs, aGetHandler);
625*cfb92d14SAndroid Build Coastguard Worker 
626*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(error != OT_ERROR_NONE);
627*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs, aSetHandler);
628*cfb92d14SAndroid Build Coastguard Worker 
629*cfb92d14SAndroid Build Coastguard Worker     exit:
630*cfb92d14SAndroid Build Coastguard Worker         return error;
631*cfb92d14SAndroid Build Coastguard Worker     }
632*cfb92d14SAndroid Build Coastguard Worker 
633*cfb92d14SAndroid Build Coastguard Worker     template <typename ValueType>
ProcessGetSet(Arg aArgs[],GetHandler<ValueType> aGetHandler,SetHandlerFailable<ValueType> aSetHandler)634*cfb92d14SAndroid Build Coastguard Worker     otError ProcessGetSet(Arg aArgs[], GetHandler<ValueType> aGetHandler, SetHandlerFailable<ValueType> aSetHandler)
635*cfb92d14SAndroid Build Coastguard Worker     {
636*cfb92d14SAndroid Build Coastguard Worker         otError error = ProcessGet(aArgs, aGetHandler);
637*cfb92d14SAndroid Build Coastguard Worker 
638*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(error != OT_ERROR_NONE);
639*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs, aSetHandler);
640*cfb92d14SAndroid Build Coastguard Worker 
641*cfb92d14SAndroid Build Coastguard Worker     exit:
642*cfb92d14SAndroid Build Coastguard Worker         return error;
643*cfb92d14SAndroid Build Coastguard Worker     }
644*cfb92d14SAndroid Build Coastguard Worker 
645*cfb92d14SAndroid Build Coastguard Worker     otError ProcessEnableDisable(Arg aArgs[], SetEnabledHandler aSetEnabledHandler);
646*cfb92d14SAndroid Build Coastguard Worker     otError ProcessEnableDisable(Arg aArgs[], SetEnabledHandlerFailable aSetEnabledHandler);
647*cfb92d14SAndroid Build Coastguard Worker     otError ProcessEnableDisable(Arg aArgs[], IsEnabledHandler aIsEnabledHandler, SetEnabledHandler aSetEnabledHandler);
648*cfb92d14SAndroid Build Coastguard Worker     otError ProcessEnableDisable(Arg                       aArgs[],
649*cfb92d14SAndroid Build Coastguard Worker                                  IsEnabledHandler          aIsEnabledHandler,
650*cfb92d14SAndroid Build Coastguard Worker                                  SetEnabledHandlerFailable aSetEnabledHandler);
651*cfb92d14SAndroid Build Coastguard Worker 
652*cfb92d14SAndroid Build Coastguard Worker     /**
653*cfb92d14SAndroid Build Coastguard Worker      * Parses a given argument string as a route preference comparing it against  "high", "med", or
654*cfb92d14SAndroid Build Coastguard Worker      * "low".
655*cfb92d14SAndroid Build Coastguard Worker      *
656*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aArg          The argument string to parse.
657*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aPreference   Reference to a `otRoutePreference` to return the parsed preference.
658*cfb92d14SAndroid Build Coastguard Worker      *
659*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_NONE             Successfully parsed @p aArg and updated @p aPreference.
660*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_ARG      @p aArg is not a valid preference string "high", "med", or "low".
661*cfb92d14SAndroid Build Coastguard Worker      *
662*cfb92d14SAndroid Build Coastguard Worker      */
663*cfb92d14SAndroid Build Coastguard Worker     static otError ParsePreference(const Arg &aArg, otRoutePreference &aPreference);
664*cfb92d14SAndroid Build Coastguard Worker 
665*cfb92d14SAndroid Build Coastguard Worker     /**
666*cfb92d14SAndroid Build Coastguard Worker      * Converts a route preference value to human-readable string.
667*cfb92d14SAndroid Build Coastguard Worker      *
668*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aPreference   The preference value to convert (`OT_ROUTE_PREFERENCE_*` values).
669*cfb92d14SAndroid Build Coastguard Worker      *
670*cfb92d14SAndroid Build Coastguard Worker      * @returns A string representation @p aPreference.
671*cfb92d14SAndroid Build Coastguard Worker      *
672*cfb92d14SAndroid Build Coastguard Worker      */
673*cfb92d14SAndroid Build Coastguard Worker     static const char *PreferenceToString(signed int aPreference);
674*cfb92d14SAndroid Build Coastguard Worker 
675*cfb92d14SAndroid Build Coastguard Worker     /**
676*cfb92d14SAndroid Build Coastguard Worker      * Parses the argument as an IP address.
677*cfb92d14SAndroid Build Coastguard Worker      *
678*cfb92d14SAndroid Build Coastguard Worker      * If the argument string is an IPv4 address, this method will try to synthesize an IPv6 address using preferred
679*cfb92d14SAndroid Build Coastguard Worker      * NAT64 prefix in the network data.
680*cfb92d14SAndroid Build Coastguard Worker      *
681*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aInstance       A pointer to OpenThread instance.
682*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aArg            The argument string to parse.
683*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aAddress        A reference to an `otIp6Address` to output the parsed IPv6 address.
684*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aSynthesized    Whether @p aAddress is synthesized from an IPv4 address.
685*cfb92d14SAndroid Build Coastguard Worker      *
686*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_NONE           The argument was parsed successfully.
687*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_ARGS   The argument is empty or does not contain a valid IP address.
688*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_STATE  No valid NAT64 prefix in the network data.
689*cfb92d14SAndroid Build Coastguard Worker      *
690*cfb92d14SAndroid Build Coastguard Worker      */
691*cfb92d14SAndroid Build Coastguard Worker     static otError ParseToIp6Address(otInstance   *aInstance,
692*cfb92d14SAndroid Build Coastguard Worker                                      const Arg    &aArg,
693*cfb92d14SAndroid Build Coastguard Worker                                      otIp6Address &aAddress,
694*cfb92d14SAndroid Build Coastguard Worker                                      bool         &aSynthesized);
695*cfb92d14SAndroid Build Coastguard Worker 
696*cfb92d14SAndroid Build Coastguard Worker     /**
697*cfb92d14SAndroid Build Coastguard Worker      * Parses the argument as a Joiner Discerner.
698*cfb92d14SAndroid Build Coastguard Worker      *
699*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aArg            The argument string to parse.
700*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aDiscerner      A reference to an `otJoinerDiscerner` to output the parsed discerner
701*cfb92d14SAndroid Build Coastguard Worker      *
702*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_NONE           The argument was parsed successfully.
703*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_ARGS   The argument is empty or does not contain a valid joiner discerner.
704*cfb92d14SAndroid Build Coastguard Worker      *
705*cfb92d14SAndroid Build Coastguard Worker      */
706*cfb92d14SAndroid Build Coastguard Worker     static otError ParseJoinerDiscerner(Arg &aArg, otJoinerDiscerner &aDiscerner);
707*cfb92d14SAndroid Build Coastguard Worker 
708*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
709*cfb92d14SAndroid Build Coastguard Worker     /**
710*cfb92d14SAndroid Build Coastguard Worker      * Parses the argument as a Border Router configuration.
711*cfb92d14SAndroid Build Coastguard Worker      *
712*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aArg            The argument string to parse.
713*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aConfig         A reference to an `otBorderRouterConfig` to output the configuration.
714*cfb92d14SAndroid Build Coastguard Worker      *
715*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_NONE           The argument was parsed successfully.
716*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_ARGS   The argument is empty or does not contain a valid configuration.
717*cfb92d14SAndroid Build Coastguard Worker      *
718*cfb92d14SAndroid Build Coastguard Worker      */
719*cfb92d14SAndroid Build Coastguard Worker     static otError ParsePrefix(Arg aArgs[], otBorderRouterConfig &aConfig);
720*cfb92d14SAndroid Build Coastguard Worker 
721*cfb92d14SAndroid Build Coastguard Worker     /**
722*cfb92d14SAndroid Build Coastguard Worker      * Parses the argument as a External Route configuration.
723*cfb92d14SAndroid Build Coastguard Worker      *
724*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aArg            The argument string to parse.
725*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aConfig         A reference to an `otExternalRouteConfig` to output the configuration.
726*cfb92d14SAndroid Build Coastguard Worker      *
727*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_NONE           The argument was parsed successfully.
728*cfb92d14SAndroid Build Coastguard Worker      * @retval OT_ERROR_INVALID_ARGS   The argument is empty or does not contain a valid configuration.
729*cfb92d14SAndroid Build Coastguard Worker      *
730*cfb92d14SAndroid Build Coastguard Worker      */
731*cfb92d14SAndroid Build Coastguard Worker     static otError ParseRoute(Arg aArgs[], otExternalRouteConfig &aConfig);
732*cfb92d14SAndroid Build Coastguard Worker #endif
733*cfb92d14SAndroid Build Coastguard Worker 
734*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint8_t kLinkModeStringSize = sizeof("rdn"); ///< Size of string buffer for a MLE Link Mode.
735*cfb92d14SAndroid Build Coastguard Worker 
736*cfb92d14SAndroid Build Coastguard Worker     /**
737*cfb92d14SAndroid Build Coastguard Worker      * Converts a given MLE Link Mode to flag string.
738*cfb92d14SAndroid Build Coastguard Worker      *
739*cfb92d14SAndroid Build Coastguard Worker      * The characters 'r', 'd', and 'n' are respectively used for `mRxOnWhenIdle`, `mDeviceType` and `mNetworkData`
740*cfb92d14SAndroid Build Coastguard Worker      * flags. If all flags are `false`, then "-" is returned.
741*cfb92d14SAndroid Build Coastguard Worker      *
742*cfb92d14SAndroid Build Coastguard Worker      * @param[in]  aLinkMode       The MLE Link Mode to convert.
743*cfb92d14SAndroid Build Coastguard Worker      * @param[out] aStringBuffer   A reference to an string array to place the string.
744*cfb92d14SAndroid Build Coastguard Worker      *
745*cfb92d14SAndroid Build Coastguard Worker      * @returns A pointer @p aStringBuffer which contains the converted string.
746*cfb92d14SAndroid Build Coastguard Worker      *
747*cfb92d14SAndroid Build Coastguard Worker      */
748*cfb92d14SAndroid Build Coastguard Worker     static const char *LinkModeToString(const otLinkModeConfig &aLinkMode, char (&aStringBuffer)[kLinkModeStringSize]);
749*cfb92d14SAndroid Build Coastguard Worker 
750*cfb92d14SAndroid Build Coastguard Worker     /**
751*cfb92d14SAndroid Build Coastguard Worker      * Converts an IPv6 address origin `OT_ADDRESS_ORIGIN_*` value to human-readable string.
752*cfb92d14SAndroid Build Coastguard Worker      *
753*cfb92d14SAndroid Build Coastguard Worker      * @param[in] aOrigin   The IPv6 address origin to convert.
754*cfb92d14SAndroid Build Coastguard Worker      *
755*cfb92d14SAndroid Build Coastguard Worker      * @returns A human-readable string representation of @p aOrigin.
756*cfb92d14SAndroid Build Coastguard Worker      *
757*cfb92d14SAndroid Build Coastguard Worker      */
758*cfb92d14SAndroid Build Coastguard Worker     static const char *AddressOriginToString(uint8_t aOrigin);
759*cfb92d14SAndroid Build Coastguard Worker 
760*cfb92d14SAndroid Build Coastguard Worker protected:
761*cfb92d14SAndroid Build Coastguard Worker     void OutputFormatV(const char *aFormat, va_list aArguments);
762*cfb92d14SAndroid Build Coastguard Worker 
763*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CLI_LOG_INPUT_OUTPUT_ENABLE
764*cfb92d14SAndroid Build Coastguard Worker     void LogInput(const Arg *aArgs);
765*cfb92d14SAndroid Build Coastguard Worker #else
LogInput(const Arg *)766*cfb92d14SAndroid Build Coastguard Worker     void LogInput(const Arg *) {}
767*cfb92d14SAndroid Build Coastguard Worker #endif
768*cfb92d14SAndroid Build Coastguard Worker 
769*cfb92d14SAndroid Build Coastguard Worker private:
770*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kInputOutputLogStringSize = OPENTHREAD_CONFIG_CLI_LOG_INPUT_OUTPUT_LOG_STRING_SIZE;
771*cfb92d14SAndroid Build Coastguard Worker 
772*cfb92d14SAndroid Build Coastguard Worker     void OutputTableHeader(uint8_t aNumColumns, const char *const aTitles[], const uint8_t aWidths[]);
773*cfb92d14SAndroid Build Coastguard Worker     void OutputTableSeparator(uint8_t aNumColumns, const uint8_t aWidths[]);
774*cfb92d14SAndroid Build Coastguard Worker 
775*cfb92d14SAndroid Build Coastguard Worker     otInstance        *mInstance;
776*cfb92d14SAndroid Build Coastguard Worker     OutputImplementer &mImplementer;
777*cfb92d14SAndroid Build Coastguard Worker };
778*cfb92d14SAndroid Build Coastguard Worker 
779*cfb92d14SAndroid Build Coastguard Worker // Specializations of `FormatStringFor<ValueType>()`
780*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)781*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<uint8_t>(void) { return "%u"; }
782*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)783*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<uint16_t>(void) { return "%u"; }
784*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)785*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<uint32_t>(void) { return "%lu"; }
786*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)787*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<int8_t>(void) { return "%d"; }
788*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)789*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<int16_t>(void) { return "%d"; }
790*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)791*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<int32_t>(void) { return "%ld"; }
792*cfb92d14SAndroid Build Coastguard Worker 
FormatStringFor(void)793*cfb92d14SAndroid Build Coastguard Worker template <> inline constexpr const char *Utils::FormatStringFor<const char *>(void) { return "%s"; }
794*cfb92d14SAndroid Build Coastguard Worker 
795*cfb92d14SAndroid Build Coastguard Worker // Specialization of ProcessGet<> for `uint32_t` and `int32_t`
796*cfb92d14SAndroid Build Coastguard Worker 
ProcessGet(Arg aArgs[],GetHandler<uint32_t> aGetHandler)797*cfb92d14SAndroid Build Coastguard Worker template <> inline otError Utils::ProcessGet<uint32_t>(Arg aArgs[], GetHandler<uint32_t> aGetHandler)
798*cfb92d14SAndroid Build Coastguard Worker {
799*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
800*cfb92d14SAndroid Build Coastguard Worker 
801*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
802*cfb92d14SAndroid Build Coastguard Worker     OutputLine(FormatStringFor<uint32_t>(), ToUlong(aGetHandler(GetInstancePtr())));
803*cfb92d14SAndroid Build Coastguard Worker 
804*cfb92d14SAndroid Build Coastguard Worker exit:
805*cfb92d14SAndroid Build Coastguard Worker     return error;
806*cfb92d14SAndroid Build Coastguard Worker }
807*cfb92d14SAndroid Build Coastguard Worker 
ProcessGet(Arg aArgs[],GetHandler<int32_t> aGetHandler)808*cfb92d14SAndroid Build Coastguard Worker template <> inline otError Utils::ProcessGet<int32_t>(Arg aArgs[], GetHandler<int32_t> aGetHandler)
809*cfb92d14SAndroid Build Coastguard Worker {
810*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
811*cfb92d14SAndroid Build Coastguard Worker 
812*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
813*cfb92d14SAndroid Build Coastguard Worker     OutputLine(FormatStringFor<int32_t>(), static_cast<long int>(aGetHandler(GetInstancePtr())));
814*cfb92d14SAndroid Build Coastguard Worker 
815*cfb92d14SAndroid Build Coastguard Worker exit:
816*cfb92d14SAndroid Build Coastguard Worker     return error;
817*cfb92d14SAndroid Build Coastguard Worker }
818*cfb92d14SAndroid Build Coastguard Worker 
819*cfb92d14SAndroid Build Coastguard Worker } // namespace Cli
820*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
821*cfb92d14SAndroid Build Coastguard Worker 
822*cfb92d14SAndroid Build Coastguard Worker #endif // CLI_UTILS_HPP_
823