jsonlEncodeAsync function

Future<void> jsonlEncodeAsync({
  1. required Object items,
  2. StringSink? sink,
  3. StringSink sinkProvider()?,
})

Implementation

Future<void> jsonlEncodeAsync({
  required Object items,
  StringSink? sink,
  StringSink Function()? sinkProvider,
}) async {
  if ((sink == null) == (sinkProvider == null)) {
    throw ArgumentError(
        'Exactly one of sink or sinkProvider must be provided.');
  }

  bool ownsSink = false;
  late StringSink activeSink = sink ??
      () {
        ownsSink = true;
        return sinkProvider!();
      }();

  try {
    switch (items) {
      case Stream stream:
        await for (final item in stream) {
          await jsonEncodeAsync(object: item, sink: activeSink);
          activeSink.writeln();
        }

      case Iterable iterable:
        for (final item in iterable) {
          await jsonEncodeAsync(object: item, sink: activeSink);
          activeSink.writeln();
        }

      default:
        throw ArgumentError(
          'The "items" parameter must be an Iterable or a Stream.',
        );
    }
  } finally {
    if (ownsSink) {
      if (activeSink is StreamSink) {
        await (activeSink as StreamSink).close();
      } else if (activeSink is Sink) {
        (activeSink as Sink).close();
      }
    }
  }
}