LibAC-dart/lib/argparse/Parser.dart

52 lines
2 KiB
Dart

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;
}
}