src/LoggerCatalogLeafProcessor.cs

using System;
using System.Threading.Tasks;
//using Microsoft.Extensions.Logging;
using NuGet.Protocol.Catalog;
 
public class LoggerCatalogLeafProcessor : ICatalogLeafProcessor
{
    private const int FailAfterCommitCount = 10;
    //private readonly ILogger<LoggerCatalogLeafProcessor> _logger;
    private DateTimeOffset? _lastCommitTimestamp;
    private int _commitCount;
 
    /*
    public LoggerCatalogLeafProcessor(ILogger<LoggerCatalogLeafProcessor> logger)
    {
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        _lastCommitTimestamp = null;
        _commitCount = 0;
    }
    */
 
    public Task<bool> ProcessPackageDeleteAsync(PackageDeleteCatalogLeaf leaf)
    {
        Console.WriteLine(
            $"{leaf.CommitTimestamp:O}: Found package delete leaf for {leaf.PackageId} {leaf.PackageVersion}.");
 
        return GetResultAsync(leaf);
    }
 
    public Task<bool> ProcessPackageDetailsAsync(PackageDetailsCatalogLeaf leaf)
    {
        Console.WriteLine(
            $"{leaf.CommitTimestamp:O}: Found package details leaf for {leaf.PackageId} {leaf.PackageVersion}.");
 
        return GetResultAsync(leaf);
    }
 
    private Task<bool> GetResultAsync(ICatalogLeafItem leaf)
    {
        if (_lastCommitTimestamp.HasValue
            && _lastCommitTimestamp.Value != leaf.CommitTimestamp)
        {
            _commitCount++;
 
            /*
            // Simulate a failure every N commits to demonstrate how cursors and failures interact.
            if (_commitCount % FailAfterCommitCount == 0)
            {
                _logger.LogError(
                    "{commitCount} catalog commits have been processed. We will now simulate a failure.",
                    FailAfterCommitCount);
                return Task.FromResult(false);
            }
            */
        }
 
        _lastCommitTimestamp = leaf.CommitTimestamp;
        return Task.FromResult(true);
    }
}