File: Utils\ResourceGroupNameHelpers.cs
Web Access
Project: src\src\Aspire.Hosting.Azure\Aspire.Hosting.Azure.csproj (Aspire.Hosting.Azure)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Globalization;
using System.Text;
 
namespace Aspire.Hosting.Azure.Utils;
 
internal static class ResourceGroupNameHelpers
{
    public static int MaxResourceGroupNameLength = 90;
 
    /// <summary>
    /// Converts or excludes any characters which are not valid resource group name components.
    /// </summary>
    /// <param name="resourceGroupName">The text to normalize.</param>
    /// <returns>The normalized resource group name or an empty string if no characters were valid.</returns>
    public static string NormalizeResourceGroupName(string resourceGroupName)
    {
        resourceGroupName = RemoveDiacritics(resourceGroupName);
 
        var stringBuilder = new StringBuilder(capacity: resourceGroupName.Length);
 
        for (var i = 0; i < resourceGroupName.Length; i++)
        {
            var c = resourceGroupName[i];
 
            if (!char.IsAsciiLetterOrDigit(c) && c != '-' && c != '_')
            {
                continue;
            }
 
            stringBuilder.Append(c);
        }
 
        return stringBuilder.ToString();
    }
 
    private static string RemoveDiacritics(string text)
    {
        var normalizedString = text.Normalize(NormalizationForm.FormD);
        var stringBuilder = new StringBuilder(capacity: normalizedString.Length);
 
        for (var i = 0; i < normalizedString.Length; i++)
        {
            var c = normalizedString[i];
            var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
            if (unicodeCategory != UnicodeCategory.NonSpacingMark)
            {
                stringBuilder.Append(c);
            }
        }
 
        return stringBuilder
            .ToString()
            .Normalize(NormalizationForm.FormC);
    }
}