File: LockFile\BuildAction.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.ProjectModel\NuGet.ProjectModel.csproj (NuGet.ProjectModel)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#nullable disable

using System;
using System.Collections.Concurrent;

namespace NuGet.ProjectModel
{
    public struct BuildAction : IEquatable<BuildAction>
    {
        private static ConcurrentDictionary<string, BuildAction> _knownBuildActions = new ConcurrentDictionary<string, BuildAction>(StringComparer.OrdinalIgnoreCase);

        public static readonly BuildAction None = Define(nameof(None));
        public static readonly BuildAction Compile = Define(nameof(Compile));
        public static readonly BuildAction Content = Define(nameof(Content));
        public static readonly BuildAction EmbeddedResource = Define(nameof(EmbeddedResource));
        public static readonly BuildAction ApplicationDefinition = Define(nameof(ApplicationDefinition));
        public static readonly BuildAction Page = Define(nameof(Page));
        public static readonly BuildAction Resource = Define(nameof(Resource));
        public static readonly BuildAction SplashScreen = Define(nameof(SplashScreen));
        public static readonly BuildAction DesignData = Define(nameof(DesignData));
        public static readonly BuildAction DesignDataWithDesignTimeCreatableTypes = Define(nameof(DesignDataWithDesignTimeCreatableTypes));
        public static readonly BuildAction CodeAnalysisDictionary = Define(nameof(CodeAnalysisDictionary));
        public static readonly BuildAction AndroidAsset = Define(nameof(AndroidAsset));
        public static readonly BuildAction AndroidResource = Define(nameof(AndroidResource));
        public static readonly BuildAction BundleResource = Define(nameof(BundleResource));

        public string Value { get; }

        public bool IsKnown { get; }

        private BuildAction(string value, bool isKnown)
        {
            Value = value;
            IsKnown = isKnown;
        }

        public static BuildAction Parse(string value)
        {
            BuildAction action;
            if (_knownBuildActions.TryGetValue(value, out action))
            {
                return action;
            }
            return new BuildAction(value, false);
        }

        public override string ToString()
        {
            return $"{Value}";
        }

        public bool Equals(BuildAction other)
        {
            return string.Equals(other.Value, Value, StringComparison.OrdinalIgnoreCase);
        }

        public override bool Equals(object obj)
        {
            return obj is BuildAction && Equals((BuildAction)obj);
        }

        public static bool operator ==(BuildAction left, BuildAction right)
        {
            return Equals(left, right);
        }

        public static bool operator !=(BuildAction left, BuildAction right)
        {
            return !Equals(left, right);
        }

        public override int GetHashCode()
        {
            if (string.IsNullOrEmpty(Value))
            {
                return 0;
            }
            return StringComparer.OrdinalIgnoreCase.GetHashCode(Value);
        }

        private static BuildAction Define(string name)
        {
            var buildAction = new BuildAction(name, true);
            _knownBuildActions[name] = buildAction;
            return buildAction;
        }
    }
}