Code/API/AnalysisAPI.cs

Partial client for Lichess API, provides GetCloudEvaluationAsync to request cloud evaluation for a FEN position and parse the response into a PositionEvaluation object. It validates inputs, builds request parameters, sends an HTTP request and deserializes JSON.

Http CallsNetworking
🌐 api/cloud-eval
#nullable enable annotations

using LichessNET.Entities.Analysis;
using LichessNET.Entities.Enumerations;
using LichessNET.Extensions;

namespace LichessNET.API;

public partial class LichessApiClient
{
    /// <summary>
    /// Gets the evaluation of a position from the Lichess cloud analysis.
    /// </summary>
    /// <param name="fen">The FEN of the position</param>
    /// <param name="multiPv">How much different variants to include in the analysis. Can go up to 5.</param>
    /// <param name="variant">Which chess variant the game is from</param>
    /// <returns>A PositionEvaluation object</returns>
    public Task<PositionEvaluation> GetCloudEvaluationAsync(string fen, int multiPv = 1,
        ChessVariant variant = ChessVariant.Standard)
    {
        return GetCloudEvaluationAsync(fen, multiPv, variant, CancellationToken.None);
    }

    /// <summary>
    /// Gets the evaluation of a position and observes cancellation while waiting
    /// for rate limiting and the HTTP response.
    /// </summary>
    public async Task<PositionEvaluation> GetCloudEvaluationAsync(string fen, int multiPv,
        ChessVariant variant, CancellationToken cancellationToken)
    {
        if (string.IsNullOrWhiteSpace(fen))
            throw new ArgumentException("FEN cannot be empty.", nameof(fen));

        if (multiPv < 1 || multiPv > 5)
            throw new ArgumentOutOfRangeException(nameof(multiPv), multiPv,
                "The number of principal variations must be between 1 and 5.");

        cancellationToken.ThrowIfCancellationRequested();

        var endpoint = "api/cloud-eval";
        var request = GetRequestScaffold(endpoint,
            Tuple.Create("fen", fen),
            Tuple.Create("multiPv", multiPv.ToString()),
            Tuple.Create("variant", variant.GetApiName()));

        var response = await SendRequest(request, cancellationToken: cancellationToken);
        var content = await response.Content.ReadAsStringAsync();
        cancellationToken.ThrowIfCancellationRequested();

        return LichessJson.Deserialize<PositionEvaluation>(content);
    }
}