← All source files

V14 / fad4e1a110e5

WorkspaceResultExtensions.cs

Lilith/Core/Workspace/Extensions/WorkspaceResultExtensions.cs

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

namespace Lilith.Core.Workspace.Extensions;

internal static class WorkspaceResultExtensions
{
    internal static string FormatReply(this WorkspaceResult result)
    {
        if (result.Data is null) return result.Message;
        var data = JsonSerializer.SerializeToElement(result.Data);
        return data.ValueKind switch
        {
            JsonValueKind.Object when data.TryGetProperty("text", out var text) =>
                result.Message + "\n" + data.GetProperty("path").GetString() + "\n" + text.GetString() +
                NextPage(data, "More text is available at offset "),
            JsonValueKind.Object when data.TryGetProperty("matches", out var matches) =>
                FormatMatches(result.Message, data, matches),
            _ when result.Status == "needs_approval" =>
                result.Message + "\nProposed text: " + data.GetProperty("content_preview").GetString(),
            JsonValueKind.Object when data.TryGetProperty("path", out var path) =>
                FormatPath(result.Message, data, path),
            _ => result.Message + "\n" + data.GetRawText()
        };
    }

    private static string NextPage(JsonElement data, string prefix) =>
        data.GetProperty("next_offset").ValueKind == JsonValueKind.Number
            ? "\n" + prefix + data.GetProperty("next_offset") + "."
            : "";

    private static string FormatMatches(string message, JsonElement data, JsonElement matches) =>
        matches.GetArrayLength() switch
        {
            0 => "No matching workspace items.",
            _ => message + "\n" + string.Join("\n", matches.EnumerateArray()
                .Select(m => m.GetProperty("path").GetString() + " — " + m.GetProperty("excerpt").GetString())) +
                NextPage(data, "Continue at offset ")
        };

    private static string FormatPath(string message, JsonElement data, JsonElement path) =>
        message + "\n" + path.GetString() +
        (data.TryGetProperty("destination", out var destination) && destination.GetString()?.Length > 0
            ? " → " + destination.GetString() : "") +
        (data.TryGetProperty("bin_id", out var bin) && bin.ValueKind == JsonValueKind.String
            ? "\nBin ID: " + bin.GetString() : "");
}