File: RuntimeModel\RuntimeDependencySet.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.Packaging\NuGet.Packaging.csproj (NuGet.Packaging)
// 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.

using System;
using System.Collections.Generic;
using System.Linq;
using NuGet.Shared;

namespace NuGet.RuntimeModel
{
    /// <remarks>
    /// Immutable.
    /// </remarks>
    public sealed class RuntimeDependencySet : IEquatable<RuntimeDependencySet>
    {
        private static readonly IReadOnlyDictionary<string, RuntimePackageDependency> EmptyDependencies = new Dictionary<string, RuntimePackageDependency>();

        /// <summary>
        /// Package Id
        /// </summary>
        public string Id { get; }

        /// <summary>
        /// Package dependencies
        /// </summary>
        public IReadOnlyDictionary<string, RuntimePackageDependency> Dependencies { get; }

        public RuntimeDependencySet(string id)
            : this(id, (IReadOnlyDictionary<string, RuntimePackageDependency>?)null)
        {
        }

        public RuntimeDependencySet(string id, IEnumerable<RuntimePackageDependency>? dependencies)
            : this(id, dependencies?.ToDictionary(d => d.Id, StringComparer.OrdinalIgnoreCase))
        {
        }

        private RuntimeDependencySet(string id, IReadOnlyDictionary<string, RuntimePackageDependency>? dependencies)
        {
            Id = id;
            Dependencies = dependencies is null or { Count: 0 } ? EmptyDependencies : dependencies;
        }

        public bool Equals(RuntimeDependencySet? other)
        {
            if (ReferenceEquals(this, other))
            {
                return true;
            }

            if (other == null)
            {
                return false;
            }

            return string.Equals(other.Id, Id, StringComparison.OrdinalIgnoreCase)
                && Dependencies.OrderedEquals(other.Dependencies, p => p.Key, StringComparer.OrdinalIgnoreCase);
        }

        public override bool Equals(object? obj)
        {
            return Equals(obj as RuntimeDependencySet);
        }

        public override int GetHashCode()
        {
            var combiner = new HashCodeCombiner();
            combiner.AddObject(Id, StringComparer.OrdinalIgnoreCase);
            combiner.AddDictionary(Dependencies);
            return combiner.CombinedHash;
        }

        public override string ToString()
        {
            return $"{Id} -> {string.Join(",", Dependencies.Select(d => d.Value.Id + " " + d.Value.VersionRange.ToString()))}";
        }
    }
}