Skip to content

Commit 482f172

Browse files
committed
Interface template
1 parent ec66d44 commit 482f172

4 files changed

Lines changed: 179 additions & 32 deletions

File tree

src/Linq2GraphQL.Generator/ClientGenerator.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,14 @@ public List<FileEntry> Generate(string schemaJson)
8787

8888

8989
Console.WriteLine("Generate Interfaces");
90-
foreach (var classType in schema.GetInterfaces())
90+
91+
var classInterfacesList = schema.GetClassTypes().Where(e => e.HasInterfaces).SelectMany(i => i.Interfaces.ToDictionary(e => i.Name, e => e.Name)).ToList();
92+
foreach (var interfaceType in schema.GetInterfaces())
9193
{
92-
var classText = new InterfaceTemplate(classType, namespaceName).TransformText();
93-
AddFile("Interfaces", classType.FileName, classText);
94+
var implementedBy = classInterfacesList.Where(e => e.Value == interfaceType.Name).Select(e=> e.Key).ToList();
95+
96+
var interfaceTemplte = new InterfaceTemplate(interfaceType, namespaceName, implementedBy).TransformText();
97+
AddFile("Interfaces", interfaceType.FileName, interfaceTemplte);
9498
}
9599

96100
Console.WriteLine("Generate Types...");

src/Linq2GraphQL.Generator/Templates/Interface/InterfaceTemplate.cs

Lines changed: 130 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace Linq2GraphQL.Generator.Templates.Interface
1515
/// Class to produce the template output
1616
/// </summary>
1717

18-
#line 1 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
18+
#line 1 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
1919
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")]
2020
public partial class InterfaceTemplate : InterfaceTemplateBase
2121
{
@@ -25,46 +25,151 @@ public partial class InterfaceTemplate : InterfaceTemplateBase
2525
/// </summary>
2626
public virtual string TransformText()
2727
{
28-
this.Write("using System;\r\nusing System.Collections.Generic;\r\nusing System.Text.Json.Serializ" +
29-
"ation;\r\nusing Linq2GraphQL.Client;\r\nusing Linq2GraphQL.Client.Converters;\r\n\r\nnam" +
30-
"espace ");
28+
this.Write("using System;\r\nusing System.Text.Json;\r\nusing System.Text.Json.Nodes;\r\nusing Syst" +
29+
"em.Text.Json.Serialization;\r\nusing Linq2GraphQL.Client;\r\nusing Linq2GraphQL.Clie" +
30+
"nt.Converters;\r\n\r\nnamespace ");
3131

32-
#line 9 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
32+
#line 10 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
3333
this.Write(this.ToStringHelper.ToStringWithCulture(namespaceName));
3434

3535
#line default
3636
#line hidden
37-
this.Write(";\r\n\r\n[JsonConverter(typeof(InterfaceConverter<");
37+
this.Write(";\r\n\r\npublic static class ");
3838

39-
#line 11 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
40-
this.Write(this.ToStringHelper.ToStringWithCulture(GetInterfaceConcreteName()));
39+
#line 12 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
40+
this.Write(this.ToStringHelper.ToStringWithCulture(classType.Name));
41+
42+
#line default
43+
#line hidden
44+
this.Write("Extentions\r\n{\r\n\r\n");
45+
46+
#line 15 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
47+
foreach (var field in implementedBy) {
48+
49+
#line default
50+
#line hidden
51+
this.Write("\r\n [GraphInterface]\r\n public static ");
52+
53+
#line 18 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
54+
this.Write(this.ToStringHelper.ToStringWithCulture(field));
55+
56+
#line default
57+
#line hidden
58+
this.Write(" ");
59+
60+
#line 18 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
61+
this.Write(this.ToStringHelper.ToStringWithCulture(field));
62+
63+
#line default
64+
#line hidden
65+
this.Write("(this ");
66+
67+
#line 18 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
68+
this.Write(this.ToStringHelper.ToStringWithCulture(classType.Name));
69+
70+
#line default
71+
#line hidden
72+
this.Write(" value)\r\n {\r\n if (value.__TypeName == \"");
73+
74+
#line 20 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
75+
this.Write(this.ToStringHelper.ToStringWithCulture(field));
76+
77+
#line default
78+
#line hidden
79+
this.Write("\")\r\n {\r\n return (");
80+
81+
#line 22 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
82+
this.Write(this.ToStringHelper.ToStringWithCulture(field));
83+
84+
#line default
85+
#line hidden
86+
this.Write(")value;\r\n }\r\n return null;\r\n }\r\n");
87+
88+
#line 26 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
89+
}
90+
91+
#line default
92+
#line hidden
93+
this.Write("}\r\n\r\n\r\ninternal class ");
94+
95+
#line 30 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
96+
this.Write(this.ToStringHelper.ToStringWithCulture(GetInterfaceConverterName()));
4197

4298
#line default
4399
#line hidden
44-
this.Write(", ");
100+
this.Write(" : InterfaceJsonConverter<");
45101

46-
#line 11 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
102+
#line 30 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
47103
this.Write(this.ToStringHelper.ToStringWithCulture(classType.Name));
48104

49105
#line default
50106
#line hidden
51-
this.Write(">))]\r\npublic interface ");
107+
this.Write(">\r\n{\r\n public override ");
108+
109+
#line 32 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
110+
this.Write(this.ToStringHelper.ToStringWithCulture(classType.Name));
111+
112+
#line default
113+
#line hidden
114+
this.Write(" Deserialize(string typeName, JsonObject json) => typeName switch\r\n {\r\n ");
115+
116+
#line 34 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
117+
foreach (var field in implementedBy) {
118+
119+
#line default
120+
#line hidden
121+
this.Write(" \"");
122+
123+
#line 35 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
124+
this.Write(this.ToStringHelper.ToStringWithCulture(field));
125+
126+
#line default
127+
#line hidden
128+
this.Write("\" => json.Deserialize<");
129+
130+
#line 35 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
131+
this.Write(this.ToStringHelper.ToStringWithCulture(field));
132+
133+
#line default
134+
#line hidden
135+
this.Write(">(),\r\n");
136+
137+
#line 36 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
138+
}
139+
140+
#line default
141+
#line hidden
142+
this.Write(" _ => json.Deserialize< ");
143+
144+
#line 37 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
145+
this.Write(this.ToStringHelper.ToStringWithCulture(GetInterfaceConcreteName()));
146+
147+
#line default
148+
#line hidden
149+
this.Write(">()\r\n };\r\n}\r\n\r\n\r\n\r\n\r\n[JsonConverter(typeof(");
150+
151+
#line 44 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
152+
this.Write(this.ToStringHelper.ToStringWithCulture(GetInterfaceConverterName()));
153+
154+
#line default
155+
#line hidden
156+
this.Write("))]\r\npublic interface ");
52157

53-
#line 12 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
158+
#line 45 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
54159
this.Write(this.ToStringHelper.ToStringWithCulture(classType.Name));
55160

56161
#line default
57162
#line hidden
58163
this.Write(" ");
59164

60-
#line 12 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
165+
#line 45 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
61166
this.Write(this.ToStringHelper.ToStringWithCulture(classType.GetInterfacesString()));
62167

63168
#line default
64169
#line hidden
65170
this.Write("\r\n{\r\n");
66171

67-
#line 14 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
172+
#line 47 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
68173

69174
foreach (var field in classType.AllFields)
70175
{
@@ -75,28 +180,28 @@ public virtual string TransformText()
75180
#line hidden
76181
this.Write("\t[JsonPropertyName(\"");
77182

78-
#line 19 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
183+
#line 52 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
79184
this.Write(this.ToStringHelper.ToStringWithCulture(field.Name));
80185

81186
#line default
82187
#line hidden
83188
this.Write("\")]\r\n\tpublic ");
84189

85-
#line 20 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
190+
#line 53 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
86191
this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.CSharpTypeNameFull));
87192

88193
#line default
89194
#line hidden
90195
this.Write(" ");
91196

92-
#line 20 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
197+
#line 53 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
93198
this.Write(this.ToStringHelper.ToStringWithCulture(field.CSharpName));
94199

95200
#line default
96201
#line hidden
97202
this.Write(" { get; set; } \r\n");
98203

99-
#line 21 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
204+
#line 54 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
100205

101206
}
102207

@@ -106,21 +211,21 @@ public virtual string TransformText()
106211
this.Write(" [JsonPropertyName(\"__typename\")]\r\n public string __TypeName { get; set; }\r" +
107212
"\n\r\n}\r\n\r\ninternal class ");
108213

109-
#line 29 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
214+
#line 62 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
110215
this.Write(this.ToStringHelper.ToStringWithCulture(GetInterfaceConcreteName()));
111216

112217
#line default
113218
#line hidden
114219
this.Write(" : ");
115220

116-
#line 29 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
221+
#line 62 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
117222
this.Write(this.ToStringHelper.ToStringWithCulture(classType.Name));
118223

119224
#line default
120225
#line hidden
121226
this.Write("\r\n{\r\n");
122227

123-
#line 31 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
228+
#line 64 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
124229

125230
foreach (var field in classType.AllFields)
126231
{
@@ -131,28 +236,28 @@ public virtual string TransformText()
131236
#line hidden
132237
this.Write("\t[JsonPropertyName(\"");
133238

134-
#line 36 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
239+
#line 69 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
135240
this.Write(this.ToStringHelper.ToStringWithCulture(field.Name));
136241

137242
#line default
138243
#line hidden
139244
this.Write("\")]\r\n\tpublic ");
140245

141-
#line 37 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
246+
#line 70 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
142247
this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.CSharpTypeNameFull));
143248

144249
#line default
145250
#line hidden
146251
this.Write(" ");
147252

148-
#line 37 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
253+
#line 70 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
149254
this.Write(this.ToStringHelper.ToStringWithCulture(field.CSharpName));
150255

151256
#line default
152257
#line hidden
153258
this.Write(" { get; set; } \r\n");
154259

155-
#line 38 "C:\Code\DevOps\Linq2GraphQL\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
260+
#line 71 "C:\Code\Github\Linq2GraphQL.Client\src\Linq2GraphQL.Generator\Templates\Interface\InterfaceTemplate.tt"
156261

157262
}
158263

src/Linq2GraphQL.Generator/Templates/Interface/InterfaceTemplate.tt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,47 @@
11
<#@ template language="C#" #>
22
<#@ assembly name="System.Core" #>
33
using System;
4-
using System.Collections.Generic;
4+
using System.Text.Json;
5+
using System.Text.Json.Nodes;
56
using System.Text.Json.Serialization;
67
using Linq2GraphQL.Client;
78
using Linq2GraphQL.Client.Converters;
89

910
namespace <#= namespaceName #>;
1011

11-
[JsonConverter(typeof(InterfaceConverter<<#= GetInterfaceConcreteName() #>, <#= classType.Name #>>))]
12+
public static class <#= classType.Name #>Extentions
13+
{
14+
15+
<# foreach (var field in implementedBy) { #>
16+
17+
[GraphInterface]
18+
public static <#= field #> <#= field #>(this <#= classType.Name #> value)
19+
{
20+
if (value.__TypeName == "<#= field #>")
21+
{
22+
return (<#= field #>)value;
23+
}
24+
return null;
25+
}
26+
<# } #>
27+
}
28+
29+
30+
internal class <#= GetInterfaceConverterName() #> : InterfaceJsonConverter<<#= classType.Name #>>
31+
{
32+
public override <#= classType.Name #> Deserialize(string typeName, JsonObject json) => typeName switch
33+
{
34+
<# foreach (var field in implementedBy) { #>
35+
"<#= field #>" => json.Deserialize<<#= field #>>(),
36+
<# } #>
37+
_ => json.Deserialize< <#= GetInterfaceConcreteName() #>>()
38+
};
39+
}
40+
41+
42+
43+
44+
[JsonConverter(typeof(<#= GetInterfaceConverterName() #>))]
1245
public interface <#= classType.Name #> <#= classType.GetInterfacesString() #>
1346
{
1447
<#

src/Linq2GraphQL.Generator/Templates/Interface/InterfaceTemplate.tt.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@ public partial class InterfaceTemplate
44
{
55
private readonly GraphqlType classType;
66
private readonly string namespaceName;
7+
private readonly List<string> implementedBy;
78

8-
public InterfaceTemplate(GraphqlType classType, string namespaceName)
9+
public InterfaceTemplate(GraphqlType classType, string namespaceName, List<string> implementedBy)
910
{
1011
this.classType = classType;
1112
this.namespaceName = namespaceName;
13+
this.implementedBy = implementedBy;
1214
}
1315

14-
16+
public string GetInterfaceConverterName()
17+
{
18+
return classType.Name + "Converter";
19+
}
1520

1621
public string GetInterfaceConcreteName()
1722
{

0 commit comments

Comments
 (0)