| File: BuildCheck\Infrastructure\CustomConfigurationData.cs | Web Access |
| Project: src\msbuild\src\Build\Microsoft.Build.csproj (Microsoft.Build) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; namespace Microsoft.Build.Experimental.BuildCheck; /// <summary> /// Holder for the key-value pairs of unstructured data from .editorconfig file, /// that were attribute to a particular rule, but were not recognized by the infrastructure. /// The configuration data that is recognized by the infrastructure is passed as <see cref="CheckConfiguration"/>. /// </summary> public sealed class CustomConfigurationData { public static CustomConfigurationData Null { get; } = new(string.Empty); public static bool NotNull(CustomConfigurationData data) => !Null.Equals(data); public CustomConfigurationData(string ruleId) { RuleId = ruleId; } public CustomConfigurationData(string ruleId, Dictionary<string, string> properties) { RuleId = ruleId; ConfigurationData = properties; } /// <summary> /// Identifier of the rule that the configuration data is for. /// </summary> public string RuleId { get; init; } /// <summary> /// Key-value pairs of unstructured data from .editorconfig file. /// E.g. if in editorconfig file we'd have: /// [*.csrpoj] /// build_check.microsoft.BC0101.name_of_targets_to_restrict = "Build,CoreCompile,ResolveAssemblyReferences" /// /// the ConfigurationData would be: /// "name_of_targets_to_restrict" -> "Build,CoreCompile,ResolveAssemblyReferences" /// </summary> public IReadOnlyDictionary<string, string>? ConfigurationData { get; init; } public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) { return false; } if (ReferenceEquals(this, obj)) { return true; } if (obj is not CustomConfigurationData) { return false; } var customConfigObj = (CustomConfigurationData)obj; if (customConfigObj.RuleId != RuleId) { return false; } // validate keys and values if (customConfigObj.ConfigurationData != null && ConfigurationData != null && ConfigurationData.Count == customConfigObj.ConfigurationData.Count) { foreach (var keyVal in customConfigObj.ConfigurationData) { if (!ConfigurationData.TryGetValue(keyVal.Key, out var value) || value != keyVal.Value) { return false; } } } else if (customConfigObj.ConfigurationData == null && ConfigurationData == null) { return true; } else { return false; } return true; } public override int GetHashCode() { throw new NotImplementedException("CustomConfigurationData does not implement GetHashCode method"); } }