|
@@ -224,6 +224,31 @@ namespace Google.Protobuf
|
|
|
return !first;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Camel-case converter with added strictness for field mask formatting.
|
|
|
+ /// </summary>
|
|
|
+ /// <exception cref="InvalidOperationException">The field mask is invalid for JSON representation</exception>
|
|
|
+ private static string ToCamelCaseForFieldMask(string input)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < input.Length; i++)
|
|
|
+ {
|
|
|
+ char c = input[i];
|
|
|
+ if (c >= 'A' && c <= 'Z')
|
|
|
+ {
|
|
|
+ throw new InvalidOperationException($"Invalid field mask to be converted to JSON: {input}");
|
|
|
+ }
|
|
|
+ if (c == '_' && i < input.Length - 1)
|
|
|
+ {
|
|
|
+ char next = input[i + 1];
|
|
|
+ if (next < 'a' || next > 'z')
|
|
|
+ {
|
|
|
+ throw new InvalidOperationException($"Invalid field mask to be converted to JSON: {input}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ToCamelCase(input);
|
|
|
+ }
|
|
|
+
|
|
|
// Converted from src/google/protobuf/util/internal/utility.cc ToCamelCase
|
|
|
// TODO: Use the new field in FieldDescriptor.
|
|
|
internal static string ToCamelCase(string input)
|
|
@@ -525,7 +550,7 @@ namespace Google.Protobuf
|
|
|
private void WriteFieldMask(StringBuilder builder, IMessage value)
|
|
|
{
|
|
|
IList paths = (IList) value.Descriptor.Fields[FieldMask.PathsFieldNumber].Accessor.GetValue(value);
|
|
|
- WriteString(builder, string.Join(",", paths.Cast<string>().Select(ToCamelCase)));
|
|
|
+ WriteString(builder, string.Join(",", paths.Cast<string>().Select(ToCamelCaseForFieldMask)));
|
|
|
}
|
|
|
|
|
|
private void WriteAny(StringBuilder builder, IMessage value)
|