using System.Buffers; using System.IO.Pipelines; using System.Text; namespace TheXamlGuy.Framework.Serial; public class SerialLineReader : SerialReader { private readonly PipeReader reader; public SerialLineReader(Stream stream) : base(stream) { reader = PipeReader.Create(stream); } public override async IAsyncEnumerable ReadAsync() { while (true) { ReadResult result = await reader.ReadAsync(); ReadOnlySequence buffer = result.Buffer; while (TryReadLine(ref buffer, out ReadOnlySequence line)) { yield return EncodingExtensions.GetString(Encoding.UTF8, line); } reader.AdvanceTo(buffer.Start, buffer.End); if (result.IsCompleted) { break; } } } private bool TryReadLine(ref ReadOnlySequence buffer, out ReadOnlySequence line) { SequencePosition? position = buffer.PositionOf((byte)'\n'); if (position == null) { line = default; return false; } line = buffer.Slice(0, position.Value); buffer = buffer.Slice(buffer.GetPosition(1, position.Value)); return true; } }