_KeyParseResult _parseKey()

in lib/src/mustachio/parser.dart [319:379]


  _KeyParseResult _parseKey({bool escape = true}) {
    var startIndex = _index;
    while (true) {
      if (_atEnd) {
        return _KeyParseResult.endOfFile;
      }
      var char = _thisChar;
      if ((char >= $a && char <= $z) ||
          (char >= $A && char <= $Z) ||
          (char >= $0 && char <= $9) ||
          char == $underscore ||
          char == $dot ||
          char == $dollar) {
        _index++;
        continue;
      } else {
        break;
      }
    }

    if (_index == startIndex) {
      return _KeyParseResult.notKey;
    }

    var key = template.substring(startIndex, _index);
    var span = _sourceFile.span(startIndex, _index);

    if (key.length > 1 &&
        (key.codeUnitAt(0) == $dot || key.codeUnitAt(key.length - 1) == $dot)) {
      // A key cannot start or end with dot.
      return _KeyParseResult.notKey;
    }

    _walkPastWhitespace();
    if (_nextAtEnd) {
      return _KeyParseResult.endOfFile;
    }

    var char0 = _thisChar;
    var char1 = _nextChar;
    if (escape) {
      if (char0 == $rbrace && char1 == $rbrace) {
        _index += 2;
        return _KeyParseResult(_KeyParseResultType.parsedKey, key, span: span);
      } else {
        return _KeyParseResult.notKey;
      }
    } else {
      if (_nextNextAtEnd) {
        return _KeyParseResult.endOfFile;
      }
      // Need one more right brace.
      var char2 = _nextNextChar;
      if (char0 == $rbrace && char1 == $rbrace && char2 == $rbrace) {
        _index += 3;
        return _KeyParseResult(_KeyParseResultType.parsedKey, key, span: span);
      } else {
        return _KeyParseResult.notKey;
      }
    }
  }