Существуют ли какие-либо ресурсы Dart, которые разбили бы строку командной строки на список <String>аргументов? - PullRequest
0 голосов
/ 24 апреля 2020

Существуют ли какие-либо Dart ресурсы, которые разбили бы командную строку String на List<String> аргументов?

ArgsParser принимает List<String> уже разделенных аргументов, обычно из main(List<String>).

1 Ответ

0 голосов
/ 24 апреля 2020

Чтобы ответить на мой собственный вопрос,

Я преобразовал понравившуюся мне Java функцию в класс Дарт Converter<String, List<String>):

import 'dart:convert';

/// Splits a `String` into a list of command-line argument parts.
/// e.g. "command -p param" -> ["command", "-p", "param"]
///
class CommandlineConverter extends Converter<String, List<String>>
{
  @override
  List<String> convert(String input) 
  {
    if (input == null || input.isEmpty) 
    {
        //no command? no string
        return [];
    }

    final List<String> result = new List<String>();

    var current = "";

    String inQuote;
    bool   lastTokenHasBeenQuoted = false;

    for (int index = 0; index < input.length; index++)
    {
        final token = input[index];

        if (inQuote != null)
        {
          if   (token == inQuote) 
          {
              lastTokenHasBeenQuoted = true;
              inQuote                = null;
          } 
          else 
          {
              current += token;
          }
        }
        else
        {
          switch (token) 
          {
            case "'": // '
            case '"': // ""

              inQuote = token;
              continue;

            case " ": // space

              if (lastTokenHasBeenQuoted || current.isNotEmpty) 
              {
                  result.add(current);
                  current = "";
              }
              break;

            default:

              current               += token;
              lastTokenHasBeenQuoted = false;
          }
        }
    }

    if (lastTokenHasBeenQuoted || current.isNotEmpty) 
    {
        result.add(current);
    }

    if (inQuote != null)
    {
        throw new Exception("Unbalanced quote $inQuote in input:\n$input");
    }

    return result;
  }
}
...