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 { 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 clone() { Argument arg; switch (getType()) { case ArgumentType.BOOL: { arg = new BoolArgument(name: name) as Argument; break; } case ArgumentType.STRING: { arg = new StringArgument(name: name, value: getValue() as String) as Argument; break; } case ArgumentType.INTEGER: { arg = new IntegerArgument(name: name, value: getValue() as int) as Argument; break; } case ArgumentType.DOUBLE: { arg = new DoubleArgument(name: name, value: getValue() as double) as Argument; break; } } return arg; } ArgumentType getType(); } enum ArgumentType { STRING, BOOL, INTEGER, DOUBLE } class Arguments { Map _args = {}; void setArg(Argument arg) { _args[arg.name] = arg; } int get count => _args.length; List getArgNames() { List args = []; for (MapEntry 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 entry in _args.entries) { args.setArg(entry.value.clone()); } return args; } }