LibAC-dart/lib/argparse/Args.dart

98 lines
2.1 KiB
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';
abstract class Argument<T> {
bool hasValue = false;
String name;
String description;
Argument({required this.name, this.description = ""});
T getValue() {
throw new UnimplementedError("This argument type has no value");
}
Argument<T> clone() {
Argument<T> arg;
switch (getType()) {
case ArgumentType.BOOL:
{
arg = new BoolArgument(name: name) as Argument<T>;
break;
}
case ArgumentType.STRING:
{
arg = new StringArgument(name: name, value: getValue() as String)
as Argument<T>;
break;
}
case ArgumentType.INTEGER:
{
arg = new IntegerArgument(name: name, value: getValue() as int)
as Argument<T>;
break;
}
case ArgumentType.DOUBLE:
{
arg = new DoubleArgument(name: name, value: getValue() as double)
as Argument<T>;
break;
}
}
return arg;
}
ArgumentType getType();
}
enum ArgumentType { STRING, BOOL, INTEGER, DOUBLE }
class Arguments {
Map<String, Argument> _args = {};
void setArg(Argument arg) {
_args[arg.name] = arg;
}
int get count => _args.length;
List<String> getArgNames() {
List<String> args = [];
for (MapEntry<String, Argument> entry in _args.entries) {
args.add(entry.key);
}
return args;
}
Argument? getArg(String name) {
if (hasArg(name))
return _args[name];
else
return null;
}
bool hasArg(String name) {
return _args.containsKey(name);
}
bool argHasValue(String name) {
if (hasArg(name)) {
Argument arg = getArg(name)!;
return arg.hasValue;
} else
throw new Exception("Warning: No such argument");
}
Arguments clone() {
Arguments args = Arguments();
for (MapEntry<String, Argument> entry in _args.entries) {
args.setArg(entry.value.clone());
}
return args;
}
}