read method
reads every line from a file calling the passed lineAction
for each line.
if you return false from a lineAction
call then
the read returns and no more lines are read.
Implementation
void read(CancelableLineAction lineAction) {
final inputStream = _file.openRead();
final stackTrace = Trace.current();
Object? exception;
final done = Completer<bool>();
late StreamSubscription<String> subscription;
subscription =
utf8.decoder.bind(inputStream).transform(const LineSplitter()).listen(
(line) async {
final cont = lineAction(line);
if (cont == false) {
await subscription
.cancel()
.then((finished) => done.complete(true));
}
},
cancelOnError: true,
//ignore: avoid_types_on_closure_parameters
onError: (Object error) {
exception = error;
done.complete(false);
},
onDone: () {
done.complete(true);
},
);
waitForEx(done.future);
if (exception != null) {
if (exception is DCliException) {
// not an exception, the user just doesn't want to continue.
} else {
throw DCliException.from(exception, stackTrace);
}
}
}