Skip to content

Commit faaa903

Browse files
committed
use attribute based converter
1 parent 593f7a9 commit faaa903

File tree

2 files changed

+33
-43
lines changed

2 files changed

+33
-43
lines changed

Tocsoft.GraphQLCodeGen.Cli/Templates/cs/CSharp.template

Lines changed: 29 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -75,54 +75,15 @@ namespace {{Namespace}}
7575
{{!# ClientClass}}
7676
public sealed class {{ClassName}} : I{{ClassName}}
7777
{
78-
{{ifTemplate 'StringifyEnums' 'true'}}
79-
internal interface IStringifiedEnum
80-
{
81-
string Value { get; }
82-
}
83-
{{/ifTemplate}}
84-
8578
private static JsonSerializerSettings jsonSettings = new JsonSerializerSettings()
8679
{
8780
Converters =
8881
{
89-
{{ifTemplate 'StringifyEnums' 'true'}}
90-
new CustomJsonStringifiedEnumConverter(),
91-
{{/ifTemplate}}
9282
new Newtonsoft.Json.Converters.StringEnumConverter(camelCaseText: false),
9383
{{ > jsonConverters }}
9484
}
9585
};
9686

97-
{{ifTemplate 'StringifyEnums' 'true'}}
98-
internal class CustomJsonStringifiedEnumConverter : JsonConverter
99-
{
100-
public override bool CanConvert(Type objectType)
101-
{
102-
return typeof(IStringifiedEnum).IsAssignableFrom(objectType);
103-
}
104-
105-
public override bool CanRead => false;
106-
107-
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
108-
{
109-
throw new NotImplementedException();
110-
}
111-
112-
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
113-
{
114-
if (value is IStringifiedEnum v)
115-
{
116-
writer.WriteValue(v.Value);
117-
}
118-
else
119-
{
120-
writer.WriteNull();
121-
}
122-
}
123-
}
124-
{{/ifTemplate}}
125-
12687
private string SerializeBody(GraphQLRequest request)
12788
{
12889
return JsonConvert.SerializeObject(request, jsonSettings);
@@ -209,7 +170,8 @@ namespace {{Namespace}}
209170
{{!# Enum}}
210171

211172
{{ifTemplate 'StringifyEnums' 'true'}}
212-
public class {{pascalCase Name}} : IStringifiedEnum
173+
[JsonConverter(typeof({{pascalCase Name}}.CustomJsonStringifiedEnumConverter))]
174+
public class {{pascalCase Name}}
213175
{
214176
static Dictionary<string, {{pascalCase Name}}> lookup = new Dictionary<string, {{pascalCase Name}}>();
215177

@@ -249,6 +211,33 @@ namespace {{Namespace}}
249211
{{#each Values}}
250212
public static readonly {{pascalCase ../Name}} {{pascalCase .}} = Create("{{.}}", true);
251213
{{/each}}
214+
215+
internal class CustomJsonStringifiedEnumConverter : JsonConverter
216+
{
217+
public override bool CanConvert(Type objectType)
218+
{
219+
return typeof({{pascalCase Name}}).IsAssignableFrom(objectType);
220+
}
221+
222+
public override bool CanRead => false;
223+
224+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
225+
{
226+
throw new NotImplementedException();
227+
}
228+
229+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
230+
{
231+
if (value is {{pascalCase Name}} v)
232+
{
233+
writer.WriteValue(v.Value);
234+
}
235+
else
236+
{
237+
writer.WriteNull();
238+
}
239+
}
240+
}
252241
}
253242
{{else}}
254243
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]

Tocsoft.GraphQLCodeGen.Tests/StringifiedEnums.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,21 @@ public async Task SettingExplicitlyTrue()
5353

5454
var code = await tester.Generate();
5555

56-
Assert.Contains(@"public class Episode : IStringifiedEnum", code);
56+
Assert.Contains(@"[JsonConverter(typeof(Episode.CustomJsonStringifiedEnumConverter))]", code);
57+
Assert.Contains(@"public class Episode", code);
5758

5859
await tester.Verify();
5960
}
6061

6162
[Fact]
6263
public async Task SettingImplicitlyTrue()
6364
{
64-
6565
tester.AddQuery("./Files/StringifiedEnums/Query.gql");
6666

6767
var code = await tester.Generate();
6868

69-
Assert.Contains(@"public class Episode : IStringifiedEnum", code);
69+
Assert.Contains(@"[JsonConverter(typeof(Episode.CustomJsonStringifiedEnumConverter))]", code);
70+
Assert.Contains(@"public class Episode", code);
7071

7172
await tester.Verify();
7273
}

0 commit comments

Comments
 (0)