File: LocalRepositories\LocalPackageMetadataResource.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.Protocol\NuGet.Protocol.csproj (NuGet.Protocol)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable disable

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Common;
using NuGet.Packaging.Core;
using NuGet.Protocol.Core.Types;

namespace NuGet.Protocol
{
    public class LocalPackageMetadataResource : PackageMetadataResource
    {
        private readonly FindLocalPackagesResource _localResource;

        public LocalPackageMetadataResource(FindLocalPackagesResource localResource)
        {
            if (localResource == null)
            {
                throw new ArgumentNullException(nameof(localResource));
            }

            _localResource = localResource;
        }

        public override Task<IEnumerable<IPackageSearchMetadata>> GetMetadataAsync(
            string packageId,
            bool includePrerelease,
            bool includeUnlisted,
            SourceCacheContext sourceCacheContext,
            ILogger log,
            CancellationToken token)
        {
            // All packages are considered listed within a local repo

            return Task.Run<IEnumerable<IPackageSearchMetadata>>(() =>
            {
                return _localResource.FindPackagesById(packageId, log, token)
                    .Where(p => includePrerelease || !p.Identity.Version.IsPrerelease)
                    .Select(GetPackageMetadata)
                    .ToList();
            },
            token);
        }

        public override Task<IPackageSearchMetadata> GetMetadataAsync(
            PackageIdentity package,
            SourceCacheContext sourceCacheContext,
            ILogger log,
            CancellationToken token)
        {
            return Task.Run<IPackageSearchMetadata>(() =>
                {
                    var packageInfo = _localResource.GetPackage(package, log, token);
                    if (packageInfo != null)
                    {
                        return GetPackageMetadata(packageInfo);
                    }
                    return null;
                },
            token);
        }

        private static IPackageSearchMetadata GetPackageMetadata(LocalPackageInfo package) => new LocalPackageSearchMetadata(package);
    }
}