Skip to content

Commit

Permalink
Improve ToCamelCase to match STJ behavior (#8278) (#8279)
Browse files Browse the repository at this point in the history
Co-authored-by: Florian Bernd <[email protected]>
  • Loading branch information
github-actions[bot] and flobernd authored Jul 30, 2024
1 parent 42af8fa commit be5b5d2
Showing 1 changed file with 46 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information.

using System;

#if ELASTICSEARCH_SERVERLESS
namespace Elastic.Clients.Elasticsearch.Serverless;
#else
Expand All @@ -10,18 +12,53 @@ namespace Elastic.Clients.Elasticsearch;

internal static class StringExtensions
{
internal static string ToCamelCase(this string s)
// Taken from:
// https://github.com/dotnet/runtime/blob/main/src/libraries/System.Text.Json/Common/JsonCamelCaseNamingPolicy.cs

internal static string ToCamelCase(this string name)
{
if (string.IsNullOrEmpty(s))
return s;
if (string.IsNullOrEmpty(name) || !char.IsUpper(name[0]))
{
return name;
}

#if NET
return string.Create(name.Length, name, (chars, name) =>
{
name.CopyTo(chars);
FixCasing(chars);
});
#else
var chars = name.ToCharArray();
FixCasing(chars);
return new string(chars);
#endif
}

private static void FixCasing(Span<char> chars)
{
for (var i = 0; i < chars.Length; i++)
{
if (i == 1 && !char.IsUpper(chars[i]))
{
break;
}

var hasNext = (i + 1 < chars.Length);

if (!char.IsUpper(s[0]))
return s;
// Stop when next char is already lowercase.
if (i > 0 && hasNext && !char.IsUpper(chars[i + 1]))
{
// If the next char is a space, lowercase current char before exiting.
if (chars[i + 1] == ' ')
{
chars[i] = char.ToLowerInvariant(chars[i]);
}

var camelCase = char.ToLowerInvariant(s[0]).ToString();
if (s.Length > 1)
camelCase += s.Substring(1);
break;
}

return camelCase;
chars[i] = char.ToLowerInvariant(chars[i]);
}
}
}

0 comments on commit be5b5d2

Please sign in to comment.