Skip to content

Commit

Permalink
🐍 Add JsonSnakeCaseNamingPolicy
Browse files Browse the repository at this point in the history
- For the use of online configuration generation
- Source: dotnet/corefx#40003
- See also: dotnet/runtime#782
  • Loading branch information
database64128 committed Sep 9, 2020
1 parent 8d21d84 commit e8d1517
Showing 1 changed file with 87 additions and 0 deletions.
87 changes: 87 additions & 0 deletions shadowsocks-uri-generator/JsonSnakeCaseNamingPolicy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

// Source: https://github.com/dotnet/corefx/pull/40003
// See also: https://github.com/dotnet/runtime/issues/782

using System;
using System.Text;
using System.Text.Json;

namespace shadowsocks_uri_generator
{
public class JsonSnakeCaseNamingPolicy : JsonNamingPolicy
{
internal enum SnakeCaseState
{
Start,
Lower,
Upper,
NewWord
}

public override string ConvertName(string name)
{
if (string.IsNullOrEmpty(name))
{
return name;
}

var sb = new StringBuilder();
var state = SnakeCaseState.Start;

var nameSpan = name.AsSpan();

for (int i = 0; i < nameSpan.Length; i++)
{
if (nameSpan[i] == ' ')
{
if (state != SnakeCaseState.Start)
{
state = SnakeCaseState.NewWord;
}
}
else if (char.IsUpper(nameSpan[i]))
{
switch (state)
{
case SnakeCaseState.Upper:
bool hasNext = (i + 1 < nameSpan.Length);
if (i > 0 && hasNext)
{
char nextChar = nameSpan[i + 1];
if (!char.IsUpper(nextChar) && nextChar != '_')
{
sb.Append('_');
}
}
break;
case SnakeCaseState.Lower:
case SnakeCaseState.NewWord:
sb.Append('_');
break;
}
sb.Append(char.ToLowerInvariant(nameSpan[i]));
state = SnakeCaseState.Upper;
}
else if (nameSpan[i] == '_')
{
sb.Append('_');
state = SnakeCaseState.Start;
}
else
{
if (state == SnakeCaseState.NewWord)
{
sb.Append('_');
}

sb.Append(nameSpan[i]);
state = SnakeCaseState.Lower;
}
}

return sb.ToString();
}
}
}

0 comments on commit e8d1517

Please sign in to comment.