Files
DotNetSolutionTools/DotNetSolutionTools.Core/Infrastructure/NugetLookup.cs
2024-01-11 15:29:21 +10:00

65 lines
1.9 KiB
C#

using NuGet.Common;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
using NuGet.Versioning;
namespace DotNetSolutionTools.Core.Infrastructure;
public static class NugetLookup
{
public static async Task<NuGetVersion> FetchPackageMetadataAsync(string packageId, bool isCurrentlyPrerelease)
{
var cache = new SourceCacheContext();
var repositories = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
var logger = NullLogger.Instance;
var resource = await repositories.GetResourceAsync<FindPackageByIdResource>();
var versions = await resource.GetAllVersionsAsync(packageId, cache, logger, CancellationToken.None);
var latestPrereleaseVersion = versions.LastOrDefault(s => s.IsPrerelease == true);
var latestStableVersion = versions.LastOrDefault(s => s.IsPrerelease == false);
if (latestStableVersion is null && latestPrereleaseVersion is null)
{
Throw(packageId);
}
if (latestStableVersion is null)
{
if (isCurrentlyPrerelease && latestPrereleaseVersion is not null)
{
return latestPrereleaseVersion;
}
else
{
Throw(packageId);
}
}
if (latestPrereleaseVersion is null)
{
return latestStableVersion;
}
if (latestStableVersion > latestPrereleaseVersion)
{
return latestStableVersion;
}
if (isCurrentlyPrerelease)
{
return latestPrereleaseVersion;
}
return latestStableVersion;
}
public static void Throw(string packageId)
{
throw new ArgumentNullException(
"latestVersion",
$"No latest stable or prerelease Nuget package version found for {packageId}"
);
}
}