File: StringComparers.cs
Web Access
Project: Microsoft.NET.ProjectData.csproj (Microsoft.NET.ProjectData)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Runtime.InteropServices;

namespace Microsoft.NET.ProjectData;

/// <summary>
/// Well-known string comparers and comparisons for Data Model types.
/// </summary>
/// <remarks>
/// This pattern is borrowed from dotnet-project-system, where centralizing comparison
/// semantics avoids scattered <see cref="StringComparer"/> and <see cref="StringComparison"/>
/// choices throughout the codebase.
/// </remarks>
public static class StringComparers
{
	/// <summary>Comparer for item type names (e.g., "Compile", "MetadataReference").</summary>
	public static StringComparer ItemType { get; } = StringComparer.OrdinalIgnoreCase;

	/// <summary>Comparer for item metadata key names (e.g., "aliases", "folderNames").</summary>
	public static StringComparer ItemMetadataName { get; } = StringComparer.OrdinalIgnoreCase;

	/// <summary>Comparer for property names (e.g., "AssemblyName", "TargetPath").</summary>
	public static StringComparer PropertyName { get; } = StringComparer.OrdinalIgnoreCase;

	/// <summary>Comparer for capability names (e.g., "SupportsHotReload", "SupportsIncrementalBuild").</summary>
	public static StringComparer Capabilities { get; } = StringComparer.OrdinalIgnoreCase;

	/// <summary>Comparer for item spec values (file paths or identifiers).</summary>
	public static StringComparer ItemSpec { get; } =
		RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase;

	/// <summary>Comparer for file paths, respecting platform case sensitivity.</summary>
	public static StringComparer Paths { get; } =
		RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase;
}

/// <summary>
/// Well-known string comparisons for Data Model types.
/// </summary>
public static class StringComparisons
{
	/// <summary>Comparison for item type names.</summary>
	public static StringComparison ItemType => StringComparison.OrdinalIgnoreCase;

	/// <summary>Comparison for item metadata key names.</summary>
	public static StringComparison ItemMetadataName => StringComparison.OrdinalIgnoreCase;

	/// <summary>Comparison for property names.</summary>
	public static StringComparison PropertyName => StringComparison.OrdinalIgnoreCase;

	/// <summary>Comparison for file paths, respecting platform case sensitivity.</summary>
	public static StringComparison Paths { get; } =
		RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;
}