readln method

  1. @override
Future<String> readln([
  1. String linebreak = '\n'
])

Implementation

@override
Future<String> readln([String linebreak = '\n']) {
  final encoding = this.encoding;
  final completer = Completer<String>();
  final buffer = StringBuffer();
  final stringSink = StringConversionSink.fromStringSink(buffer);
  final byteSink = encoding.decoder.startChunkedConversion(stringSink);

  late StreamSubscription<List<int>> sub;
  sub = stream.listen((bytes) {
    byteSink.add(bytes);

    var string = buffer.toString();

    final matches = linebreak.allMatches(string);
    if (matches.isNotEmpty) {
      string = string.substring(0, matches.first.start);
      sub.cancel();
      byteSink.close();
      stringSink.close();
      completer.complete(string);
    }
  }, onError: (error, stackTrace) {
    sub.cancel();
    byteSink.close();
    stringSink.close();
    completer.completeError(error, stackTrace);
  }, onDone: () {
    sub.cancel();
    byteSink.close();
    stringSink.close();
    completer.completeError(StateError("Serial input stream closed prematurely."), StackTrace.current);
  });

  return completer.future;
}