@@ -37,17 +37,30 @@ bool Command::InitArguments(int argc, char ** argv)
37
37
bool isValidCommand = false ;
38
38
size_t argsCount = mArgs .size ();
39
39
40
- VerifyOrExit (argsCount == (size_t )(argc),
40
+ size_t argsOptionalCount = 0 ;
41
+ for (size_t i = 0 ; i < argsCount; i++)
42
+ {
43
+ if (mArgs [i].optional )
44
+ {
45
+ argsOptionalCount++;
46
+ }
47
+ }
48
+
49
+ VerifyOrExit ((size_t )(argc) >= (argsCount - argsOptionalCount) && (size_t )(argc) <= argsCount,
41
50
ChipLogError (chipTool, " InitArgs: Wrong arguments number: %d instead of %zu" , argc, argsCount));
42
51
43
- for (size_t i = 0 ; i < argsCount ; i++)
52
+ for (size_t i = 0 ; i < ( size_t ) argc ; i++)
44
53
{
45
54
if (!InitArgument (i, argv[i]))
46
55
{
47
56
ExitNow ();
48
57
}
49
58
}
50
59
60
+ for (size_t i = (size_t ) argc; i < argsCount; i++)
61
+ {
62
+ }
63
+
51
64
isValidCommand = true ;
52
65
53
66
exit :
@@ -93,26 +106,34 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
93
106
switch (arg.type )
94
107
{
95
108
case ArgumentType::Attribute: {
109
+ if (arg.optional )
110
+ arg.value = &(reinterpret_cast <chip::Optional<char *> *>(arg.value ))->Emplace ();
96
111
char * value = reinterpret_cast <char *>(arg.value );
97
112
isValidArgument = (strcmp (argValue, value) == 0 );
98
113
break ;
99
114
}
100
115
101
116
case ArgumentType::String: {
117
+ if (arg.optional )
118
+ arg.value = &(reinterpret_cast <chip::Optional<const char **> *>(arg.value ))->Emplace ();
102
119
const char ** value = reinterpret_cast <const char **>(arg.value );
103
120
*value = argValue;
104
121
isValidArgument = true ;
105
122
break ;
106
123
}
107
124
108
125
case ArgumentType::CharString: {
126
+ if (arg.optional )
127
+ arg.value = &(reinterpret_cast <chip::Optional<chip::Span<const char >> *>(arg.value ))->Emplace ();
109
128
auto * value = static_cast <chip::Span<const char > *>(arg.value );
110
129
*value = chip::Span<const char >(argValue, strlen (argValue));
111
130
isValidArgument = true ;
112
131
break ;
113
132
}
114
133
115
134
case ArgumentType::OctetString: {
135
+ if (arg.optional )
136
+ arg.value = &(reinterpret_cast <chip::Optional<chip::ByteSpan *> *>(arg.value ))->Emplace ();
116
137
auto * value = static_cast <chip::ByteSpan *>(arg.value );
117
138
// We support two ways to pass an octet string argument. If it happens
118
139
// to be all-ASCII, you can just pass it in. Otherwise you can pass in
@@ -167,6 +188,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
167
188
168
189
case ArgumentType::Boolean :
169
190
case ArgumentType::Number_uint8: {
191
+ if (arg.optional )
192
+ arg.value = &(reinterpret_cast <chip::Optional<uint8_t *> *>(arg.value ))->Emplace ();
170
193
uint8_t * value = reinterpret_cast <uint8_t *>(arg.value );
171
194
172
195
// stringstream treats uint8_t as char, which is not what we want here.
@@ -190,6 +213,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
190
213
}
191
214
192
215
case ArgumentType::Number_uint16: {
216
+ if (arg.optional )
217
+ arg.value = &(reinterpret_cast <chip::Optional<uint16_t *> *>(arg.value ))->Emplace ();
193
218
uint16_t * value = reinterpret_cast <uint16_t *>(arg.value );
194
219
std::stringstream ss;
195
220
isHexNotation ? ss << std::hex << argValue : ss << argValue;
@@ -202,6 +227,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
202
227
}
203
228
204
229
case ArgumentType::Number_uint32: {
230
+ if (arg.optional )
231
+ arg.value = &(reinterpret_cast <chip::Optional<uint32_t *> *>(arg.value ))->Emplace ();
205
232
uint32_t * value = reinterpret_cast <uint32_t *>(arg.value );
206
233
std::stringstream ss;
207
234
isHexNotation ? ss << std::hex << argValue : ss << argValue;
@@ -214,6 +241,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
214
241
}
215
242
216
243
case ArgumentType::Number_uint64: {
244
+ if (arg.optional )
245
+ arg.value = &(reinterpret_cast <chip::Optional<uint64_t *> *>(arg.value ))->Emplace ();
217
246
uint64_t * value = reinterpret_cast <uint64_t *>(arg.value );
218
247
std::stringstream ss;
219
248
isHexNotation ? ss << std::hex << argValue : ss << argValue;
@@ -226,6 +255,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
226
255
}
227
256
228
257
case ArgumentType::Number_int8: {
258
+ if (arg.optional )
259
+ arg.value = &(reinterpret_cast <chip::Optional<int8_t *> *>(arg.value ))->Emplace ();
229
260
int8_t * value = reinterpret_cast <int8_t *>(arg.value );
230
261
231
262
// stringstream treats int8_t as char, which is not what we want here.
@@ -249,6 +280,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
249
280
}
250
281
251
282
case ArgumentType::Number_int16: {
283
+ if (arg.optional )
284
+ arg.value = &(reinterpret_cast <chip::Optional<int16_t *> *>(arg.value ))->Emplace ();
252
285
int16_t * value = reinterpret_cast <int16_t *>(arg.value );
253
286
std::stringstream ss;
254
287
isHexNotation ? ss << std::hex << argValue : ss << argValue;
@@ -261,6 +294,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
261
294
}
262
295
263
296
case ArgumentType::Number_int32: {
297
+ if (arg.optional )
298
+ arg.value = &(reinterpret_cast <chip::Optional<int32_t *> *>(arg.value ))->Emplace ();
264
299
int32_t * value = reinterpret_cast <int32_t *>(arg.value );
265
300
std::stringstream ss;
266
301
isHexNotation ? ss << std::hex << argValue : ss << argValue;
@@ -273,6 +308,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
273
308
}
274
309
275
310
case ArgumentType::Number_int64: {
311
+ if (arg.optional )
312
+ arg.value = &(reinterpret_cast <chip::Optional<int64_t *> *>(arg.value ))->Emplace ();
276
313
int64_t * value = reinterpret_cast <int64_t *>(arg.value );
277
314
std::stringstream ss;
278
315
isHexNotation ? ss << std::hex << argValue : ss << argValue;
@@ -285,6 +322,8 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
285
322
}
286
323
287
324
case ArgumentType::Address: {
325
+ if (arg.optional )
326
+ arg.value = &(reinterpret_cast <chip::Optional<AddressWithInterface *> *>(arg.value ))->Emplace ();
288
327
AddressWithInterface * value = reinterpret_cast <AddressWithInterface *>(arg.value );
289
328
isValidArgument = ParseAddressWithInterface (argValue, value);
290
329
break ;
@@ -299,82 +338,89 @@ bool Command::InitArgument(size_t argIndex, char * argValue)
299
338
return isValidArgument;
300
339
}
301
340
302
- size_t Command::AddArgument (const char * name, const char * value)
341
+ size_t Command::AddArgument (const char * name, const char * value, bool optional )
303
342
{
304
343
Argument arg;
305
- arg.type = ArgumentType::Attribute;
306
- arg.name = name;
307
- arg.value = const_cast <void *>(reinterpret_cast <const void *>(value));
344
+ arg.type = ArgumentType::Attribute;
345
+ arg.name = name;
346
+ arg.value = const_cast <void *>(reinterpret_cast <const void *>(value));
347
+ arg.optional = optional;
308
348
309
349
mArgs .emplace_back (arg);
310
350
return mArgs .size ();
311
351
}
312
352
313
- size_t Command::AddArgument (const char * name, char ** value)
353
+ size_t Command::AddArgument (const char * name, char ** value, bool optional )
314
354
{
315
355
Argument arg;
316
- arg.type = ArgumentType::CharString;
317
- arg.name = name;
318
- arg.value = reinterpret_cast <void *>(value);
356
+ arg.type = ArgumentType::CharString;
357
+ arg.name = name;
358
+ arg.value = reinterpret_cast <void *>(value);
359
+ arg.optional = optional;
319
360
320
361
mArgs .emplace_back (arg);
321
362
return mArgs .size ();
322
363
}
323
364
324
- size_t Command::AddArgument (const char * name, chip::CharSpan * value)
365
+ size_t Command::AddArgument (const char * name, chip::CharSpan * value, bool optional )
325
366
{
326
367
Argument arg;
327
- arg.type = ArgumentType::CharString;
328
- arg.name = name;
329
- arg.value = reinterpret_cast <void *>(value);
368
+ arg.type = ArgumentType::CharString;
369
+ arg.name = name;
370
+ arg.value = reinterpret_cast <void *>(value);
371
+ arg.optional = optional;
330
372
331
373
mArgs .emplace_back (arg);
332
374
return mArgs .size ();
333
375
}
334
376
335
- size_t Command::AddArgument (const char * name, chip::ByteSpan * value)
377
+ size_t Command::AddArgument (const char * name, chip::ByteSpan * value, bool optional )
336
378
{
337
379
Argument arg;
338
- arg.type = ArgumentType::OctetString;
339
- arg.name = name;
340
- arg.value = reinterpret_cast <void *>(value);
380
+ arg.type = ArgumentType::OctetString;
381
+ arg.name = name;
382
+ arg.value = reinterpret_cast <void *>(value);
383
+ arg.optional = optional;
341
384
342
385
mArgs .emplace_back (arg);
343
386
return mArgs .size ();
344
387
}
345
388
346
- size_t Command::AddArgument (const char * name, AddressWithInterface * out)
389
+ size_t Command::AddArgument (const char * name, AddressWithInterface * out, bool optional )
347
390
{
348
391
Argument arg;
349
- arg.type = ArgumentType::Address;
350
- arg.name = name;
351
- arg.value = reinterpret_cast <void *>(out);
392
+ arg.type = ArgumentType::Address;
393
+ arg.name = name;
394
+ arg.value = reinterpret_cast <void *>(out);
395
+ arg.optional = optional;
352
396
353
397
mArgs .emplace_back (arg);
354
398
return mArgs .size ();
355
399
}
356
400
357
- size_t Command::AddArgument (const char * name, int64_t min, uint64_t max, void * out, ArgumentType type)
401
+ size_t Command::AddArgument (const char * name, int64_t min, uint64_t max, void * out, ArgumentType type, bool optional )
358
402
{
359
403
Argument arg;
360
- arg.type = type;
361
- arg.name = name;
362
- arg.value = out;
363
- arg.min = min;
364
- arg.max = max;
404
+ arg.type = type;
405
+ arg.name = name;
406
+ arg.value = out;
407
+ arg.min = min;
408
+ arg.max = max;
409
+ arg.optional = optional;
365
410
366
411
mArgs .emplace_back (arg);
367
412
return mArgs .size ();
368
413
}
369
414
370
- size_t Command::AddArgument (const char * name, int64_t min, uint64_t max, void * out)
415
+ size_t Command::AddArgument (const char * name, int64_t min, uint64_t max, void * out, bool optional )
371
416
{
372
417
Argument arg;
373
- arg.type = ArgumentType::Number_uint8;
374
- arg.name = name;
375
- arg.value = out;
376
- arg.min = min;
377
- arg.max = max;
418
+ arg.type = ArgumentType::Number_uint8;
419
+ arg.name = name;
420
+ arg.value = out;
421
+ arg.min = min;
422
+ arg.max = max;
423
+ arg.optional = optional;
378
424
379
425
mArgs .emplace_back (arg);
380
426
return mArgs .size ();
0 commit comments