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 { String name; Argument({required this.name}); 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(); bool hasValue(); } 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 argsx = []; for (MapEntry entry in args.entries) { argsx.add(entry.key); } return argsx; } /// Removes the argument if present. Otherwise does nothing. /// /// Returns true if the argument was present and removed. False otherwise. bool removeArg(String name) { if (args.containsKey(name)) { args.remove(name); return true; } else return false; } 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 argsx = Arguments(); for (MapEntry entry in args.entries) { argsx.setArg(entry.value.clone()); } return argsx; } List getArgumentsList() { List argsx = []; for (var entry in args.entries) { argsx.add(entry.value); } return argsx; } }