choose method

Future choose()

Implementation

Future<dynamic> choose() {
  var buff = StringBuffer();
  var i = -1;

  for (var choice in choices) {
    i++;
    buff.writeln(formatter(choice, i + 1));
  }

  buff.write(message);

  var completer = Completer();

  var process;
  process = (String input) {
    var result = _parseInteger(input);

    if (result == null) {
      var exists = choices
          .map((it) => it.toString().trim().toLowerCase())
          .contains(input.trim().toLowerCase());
      if (exists) {
        var val = choices.firstWhere((it) {
          return it.toString().trim().toLowerCase() ==
              input.trim().toLowerCase();
        });

        completer.complete(val);
        return;
      }
    }

    var choice;

    try {
      if (result == null) {
        Prompter(buff.toString()).prompt().then(process);
      } else {
        choice = choices[result - 1];
        completer.complete(choice);
      }
    } catch (e) {
      Prompter(buff.toString()).prompt().then(process);
    }
  };

  Prompter(buff.toString()).prompt().then(process);

  return completer.future;
}