Skip to content

Commit 79ff8a5

Browse files
committed
Move field type resolving logic to separate class
1 parent eebea1b commit 79ff8a5

2 files changed

Lines changed: 65 additions & 57 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Google.Protobuf.Reflection;
2+
using Google.Protobuf.WellKnownTypes;
3+
using Type = System.Type;
4+
5+
namespace Protobuf.System.Text.Json;
6+
7+
internal static class FieldTypeResolver
8+
{
9+
public static Type ResolverFieldType(FieldDescriptor fieldDescriptor, Dictionary<string, Type> propertyTypeLookup)
10+
{
11+
switch (fieldDescriptor.FieldType)
12+
{
13+
case FieldType.Double:
14+
return typeof(double);
15+
case FieldType.Float:
16+
return typeof(float);
17+
case FieldType.Int32:
18+
case FieldType.SInt32:
19+
case FieldType.SFixed32:
20+
return typeof(int);
21+
case FieldType.Int64:
22+
case FieldType.SInt64:
23+
case FieldType.SFixed64:
24+
return typeof(long);
25+
case FieldType.UInt32:
26+
case FieldType.Fixed32:
27+
return typeof(uint);
28+
case FieldType.UInt64:
29+
case FieldType.Fixed64:
30+
return typeof(ulong);
31+
case FieldType.Bool:
32+
return typeof(bool);
33+
case FieldType.String:
34+
return typeof(string);
35+
case FieldType.Message when fieldDescriptor.MessageType.ClrType is { } clrType:
36+
if (clrType == typeof(DoubleValue))
37+
return typeof(double?);
38+
if (clrType == typeof(FloatValue))
39+
return typeof(float?);
40+
if (clrType == typeof(Int64Value))
41+
return typeof(long?);
42+
if (clrType == typeof(UInt64Value))
43+
return typeof(ulong?);
44+
if (clrType == typeof(Int32Value))
45+
return typeof(int?);
46+
if (clrType == typeof(UInt32Value))
47+
return typeof(uint?);
48+
if (clrType == typeof(BoolValue))
49+
return typeof(bool?);
50+
if (clrType == typeof(StringValue))
51+
return typeof(string);
52+
return clrType;
53+
case FieldType.Enum when fieldDescriptor.IsRepeated:
54+
var fieldType = propertyTypeLookup[fieldDescriptor.PropertyName];
55+
return fieldType.GenericTypeArguments[0];
56+
case FieldType.Enum:
57+
case FieldType.Message:
58+
return propertyTypeLookup[fieldDescriptor.PropertyName];
59+
default:
60+
throw new ArgumentOutOfRangeException(nameof(fieldDescriptor),
61+
$"FieldType: '{fieldDescriptor}' is not supported.");
62+
}
63+
}
64+
}

src/Protobuf.System.Text.Json/ProtobufConverter.cs

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Text.Json.Serialization;
44
using Google.Protobuf;
55
using Google.Protobuf.Reflection;
6-
using Google.Protobuf.WellKnownTypes;
76
using Protobuf.System.Text.Json.InternalConverters;
87
using Type = System.Type;
98

@@ -33,7 +32,7 @@ public ProtobufConverter(JsonSerializerOptions jsonSerializerOptions, JsonProtob
3332
Accessor = fieldDescriptor.Accessor,
3433
IsRepeated = fieldDescriptor.IsRepeated,
3534
IsMap = fieldDescriptor.IsMap,
36-
FieldType = GetFieldType(fieldDescriptor, propertyTypeLookup),
35+
FieldType = FieldTypeResolver.ResolverFieldType(fieldDescriptor, propertyTypeLookup),
3736
JsonName = convertNameFunc(fieldDescriptor),
3837
IsOneOf = fieldDescriptor.ContainingOneof != null
3938
}).ToArray();
@@ -142,59 +141,4 @@ public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOption
142141

143142
writer.WriteEndObject();
144143
}
145-
146-
private Type GetFieldType(FieldDescriptor fieldDescriptor, Dictionary<string, Type> propertyTypeLookup)
147-
{
148-
switch (fieldDescriptor.FieldType)
149-
{
150-
case FieldType.Double:
151-
return typeof(double);
152-
case FieldType.Float:
153-
return typeof(float);
154-
case FieldType.Int32:
155-
case FieldType.SInt32:
156-
case FieldType.SFixed32:
157-
return typeof(int);
158-
case FieldType.Int64:
159-
case FieldType.SInt64:
160-
case FieldType.SFixed64:
161-
return typeof(long);
162-
case FieldType.UInt32:
163-
case FieldType.Fixed32:
164-
return typeof(uint);
165-
case FieldType.UInt64:
166-
case FieldType.Fixed64:
167-
return typeof(ulong);
168-
case FieldType.Bool:
169-
return typeof(bool);
170-
case FieldType.String:
171-
return typeof(string);
172-
case FieldType.Message when fieldDescriptor.MessageType.ClrType is { } clrType:
173-
if (clrType == typeof(DoubleValue))
174-
return typeof(double?);
175-
if (clrType == typeof(FloatValue))
176-
return typeof(float?);
177-
if (clrType == typeof(Int64Value))
178-
return typeof(long?);
179-
if (clrType == typeof(UInt64Value))
180-
return typeof(ulong?);
181-
if (clrType == typeof(Int32Value))
182-
return typeof(int?);
183-
if (clrType == typeof(UInt32Value))
184-
return typeof(uint?);
185-
if (clrType == typeof(BoolValue))
186-
return typeof(bool?);
187-
if (clrType == typeof(StringValue))
188-
return typeof(string);
189-
return clrType;
190-
case FieldType.Enum when fieldDescriptor.IsRepeated:
191-
var fieldType = propertyTypeLookup[fieldDescriptor.PropertyName];
192-
return fieldType.GenericTypeArguments[0];
193-
case FieldType.Enum:
194-
case FieldType.Message:
195-
return propertyTypeLookup[fieldDescriptor.PropertyName];
196-
default:
197-
throw new ArgumentOutOfRangeException(nameof(fieldDescriptor), $"FieldType: '{fieldDescriptor}' is not supported.");
198-
}
199-
}
200144
}

0 commit comments

Comments
 (0)