← All source files

V13 / 7879e8b5740b

OllamaCliStreamReader.cs

Lilith/Core/Ollama/OllamaCliStreamReader.cs

Unchanged from the preceding version
CS
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;

namespace Lilith.Core.Ollama;

internal static class OllamaCliStreamReader
{
    public static async Task PumpAsync(TextReader reader, OllamaCliProgressTracker tracker, CancellationToken cancellationToken = default)
    {
        var buffer = new char[512];
        var segment = new StringBuilder();

        while (!cancellationToken.IsCancellationRequested)
        {
            int read = await reader.ReadAsync(buffer, cancellationToken);
            if (read <= 0)
            {
                break;
            }

            for (int i = 0; i < read; i++)
            {
                char c = buffer[i];
                if (c is '\r' or '\n')
                {
                    Flush(segment, tracker);
                }
                else
                {
                    segment.Append(c);
                }
            }
        }

        Flush(segment, tracker);
    }

    private static void Flush(StringBuilder segment, OllamaCliProgressTracker tracker)
    {
        if (segment.Length == 0)
        {
            return;
        }

        tracker.Update(segment.ToString());
        segment.Clear();
    }
}