parseMailboxes function

List<Address> parseMailboxes(
  1. String addresses
)

Parse a comma-separated list of rfc5322 3.4 mailboxes to a List<Address>. Does not handle rfc5322 comments.

Implementation

List<Address> parseMailboxes(String addresses) {
  var result = <Address>[];
  var inQuote = false;
  var inAngleBrackets = false;
  var nameOrEmail = <int>[];
  var email = <int>[];
  var name = <int>[];

  void addAddress() {
    if (nameOrEmail.isNotEmpty) {
      if (email.isEmpty) {
        email.addAll(nameOrEmail);
      } else if (name.isEmpty) {
        name.addAll(nameOrEmail);
      }
    }

    if (email.isNotEmpty) {
      result.add(Address(String.fromCharCodes(email).trim(),
          String.fromCharCodes(name).trim()));
    }

    email.clear();
    name.clear();
    nameOrEmail.clear();
    inAngleBrackets = false;
    inQuote = false;
  }

  var codeUnits = addresses.codeUnits;
  for (var p = 0; p < codeUnits.length; p++) {
    var c = codeUnits[p];
    if (inQuote) {
      if (c == _quoteCodeUnit) {
        inQuote = false;
      } else if (c == _backslashCodeUnit) {
        // Handle \ escape - \" inside of quotes
        ++p;
        if (p < codeUnits.length) {
          name.add(codeUnits[p]);
        }
      } else {
        name.add(c);
      }
    } else if (inAngleBrackets) {
      if (c == _closeAngleBracket) {
        inAngleBrackets = false;
      } else {
        email.add(c);
      }
    } else if (c == _commaCodeUnit) {
      addAddress();
    } else if (c == _quoteCodeUnit) {
      inQuote = true;
    } else if (c == _openAngleBracket) {
      inAngleBrackets = true;
    } else {
      nameOrEmail.add(c);
    }
  }

  // Catch last one, if any.
  addAddress();

  return result;
}