Overhaul the argument parsing API
This commit is contained in:
parent
62d26082c9
commit
82f5c18129
9 changed files with 207 additions and 153 deletions
52
lib/argparse/Parser.dart
Normal file
52
lib/argparse/Parser.dart
Normal file
|
@ -0,0 +1,52 @@
|
|||
import 'package:libac_dart/argparse/Args.dart';
|
||||
import 'package:libac_dart/argparse/types/Bool.dart';
|
||||
import 'package:libac_dart/argparse/types/Integers.dart';
|
||||
import 'package:libac_dart/argparse/types/String.dart';
|
||||
|
||||
class ArgumentParser {
|
||||
/// Parses a list of arguments.
|
||||
///
|
||||
/// [args] The list of arguments to parse.
|
||||
/// Returns an Arguments object representing the input.
|
||||
static Arguments parse(List<String> args) {
|
||||
final ret = Arguments();
|
||||
for (var i = 0; i < args.length; i++) {
|
||||
final arg = args[i];
|
||||
if (arg.startsWith('--')) {
|
||||
var key = arg.substring(2); // Remove the '--' part of the argument
|
||||
dynamic value;
|
||||
|
||||
// Check if the argument has a value attached (either --arg=value or --arg value)
|
||||
if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
|
||||
value = args[i + 1]; // --arg value
|
||||
i++; // Skip the next argument as it is the value
|
||||
} else if (arg.contains('=')) {
|
||||
value = arg.substring(arg.indexOf('=') + 1); // --arg=value
|
||||
key = key.substring(0, key.indexOf('='));
|
||||
}
|
||||
|
||||
// Determine the argument type and add it to the list
|
||||
if (int.tryParse(value?.toString() ?? '') != null) {
|
||||
ret.setArg(
|
||||
IntegerArgument(name: key, value: int.parse(value.toString())));
|
||||
} else if (value?.toString().toLowerCase() == 'true' ||
|
||||
value?.toString().toLowerCase() == 'false' ||
|
||||
value == null) {
|
||||
if (value != null)
|
||||
ret.setArg(BoolArgument(
|
||||
name: key, value: value.toString().toLowerCase() == 'true'));
|
||||
else
|
||||
ret.setArg(BoolArgument(name: key, value: true));
|
||||
} else if (double.tryParse(value?.toString() ?? '') != null) {
|
||||
ret.setArg(
|
||||
DoubleArgument(name: key, value: double.parse(value.toString())));
|
||||
} else {
|
||||
// Default to StringArgument if no matching type is found
|
||||
ret.setArg(StringArgument(name: key, value: value?.toString() ?? ''));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue