File: FrameworkDependency.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.LibraryModel\NuGet.LibraryModel.csproj (NuGet.LibraryModel)
// 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 NuGet.Common;
using NuGet.Shared;

namespace NuGet.LibraryModel
{
    public sealed class FrameworkDependency : IEquatable<FrameworkDependency>, IComparable<FrameworkDependency>
    {
        public string Name { get; }

        public FrameworkDependencyFlags PrivateAssets { get; }

        public FrameworkDependency(
            string name,
            FrameworkDependencyFlags privateAssets)
        {
            Name = name ?? throw new ArgumentNullException(nameof(name));
            PrivateAssets = privateAssets;
        }

        public int CompareTo(FrameworkDependency? other)
        {
            if (ReferenceEquals(other, null))
            {
                return 1;
            }

            var compare = ComparisonUtility.FrameworkReferenceNameComparer.Compare(Name, other.Name);

            if (compare == 0)
            {
                int thisPrivateAssets = (int)PrivateAssets;
                int otherPrivateAssets = (int)other.PrivateAssets;
                return thisPrivateAssets.CompareTo(otherPrivateAssets);
            }

            return compare;
        }

        public bool Equals(FrameworkDependency? other)
        {
            if (other == null)
            {
                return false;
            }

            if (ReferenceEquals(this, other))
            {
                return true;
            }

            return ComparisonUtility.FrameworkReferenceNameComparer.Equals(Name, other.Name) &&
                   PrivateAssets == other.PrivateAssets;
        }

        public override int GetHashCode()
        {
            var hashCode = new HashCodeCombiner();
            hashCode.AddObject(ComparisonUtility.FrameworkReferenceNameComparer.GetHashCode(Name));
            hashCode.AddStruct(PrivateAssets);
            return hashCode.CombinedHash;
        }
    }
}