File: Commands\PackageSearch\PackageSearchResultJsonRenderer.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.CommandLine.XPlat\NuGet.CommandLine.XPlat.csproj (NuGet.CommandLine.XPlat)
// 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.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using NuGet.Configuration;
using NuGet.Protocol.Core.Types;

namespace NuGet.CommandLine.XPlat
{
    internal class PackageSearchResultJsonRenderer : IPackageSearchResultRenderer
    {
        private ILoggerWithColor _logger;
        private PackageSearchVerbosity _verbosity;
        private bool _exactMatch;
        private SearchMainOutput _packageSearchMainOutput;

        public PackageSearchResultJsonRenderer(ILoggerWithColor loggerWithColor, PackageSearchVerbosity verbosity, bool exactMatch)
        {
            _logger = loggerWithColor;
            _verbosity = verbosity;
            _exactMatch = exactMatch;
        }

        public void Add(PackageSource source, IEnumerable<IPackageSearchMetadata> completedSearch)
        {
            PackageSearchResult packageSearchResult = new PackageSearchResult(source.Name);

            foreach (IPackageSearchMetadata metadata in completedSearch)
            {
                packageSearchResult.Packages.Add(metadata);
            }

            _packageSearchMainOutput.SearchResult.Add(packageSearchResult);
        }

        public void Add(PackageSource source, PackageSearchProblem packageSearchProblem)
        {
            PackageSearchResult packageSearchResult = new PackageSearchResult(source.Name)
            {
                Problems = new List<PackageSearchProblem>() { packageSearchProblem }
            };
            _packageSearchMainOutput.SearchResult.Add(packageSearchResult);
        }

        public void Finish()
        {
            var options = new JsonSerializerOptions
            {
                WriteIndented = true,
                Converters = { new SearchResultPackagesConverter(_verbosity, _exactMatch) },
                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
            };
            var json = JsonSerializer.Serialize(_packageSearchMainOutput, new PackageSearchJsonContext(options).SearchMainOutput);
            _logger.LogMinimal(json);
        }

        public void Add(PackageSearchProblem packageSearchProblem)
        {
            _packageSearchMainOutput.Problems.Add(packageSearchProblem);
        }

        public void Start()
        {
            _packageSearchMainOutput = new SearchMainOutput();
        }
    }
}