-
-
Notifications
You must be signed in to change notification settings - Fork 50
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #72 from angelofb/main
make use of new language features
- Loading branch information
Showing
4 changed files
with
110 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,87 +1,90 @@ | ||
using System.Linq; | ||
using NSwag; | ||
using System.Linq; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
using NSwag; | ||
|
||
namespace Refitter.Core | ||
namespace Refitter.Core; | ||
|
||
public class RefitGenerator | ||
{ | ||
public class RefitGenerator | ||
private readonly RefitGeneratorSettings settings; | ||
private readonly OpenApiDocument document; | ||
private readonly CSharpClientGeneratorFactory factory; | ||
|
||
private RefitGenerator(RefitGeneratorSettings settings, OpenApiDocument document) | ||
{ | ||
private readonly RefitGeneratorSettings settings; | ||
private readonly OpenApiDocument document; | ||
private readonly CSharpClientGeneratorFactory factory; | ||
this.settings = settings; | ||
this.document = document; | ||
factory = new CSharpClientGeneratorFactory(settings, document); | ||
} | ||
|
||
private RefitGenerator(RefitGeneratorSettings settings, OpenApiDocument document) | ||
{ | ||
this.settings = settings; | ||
this.document = document; | ||
factory = new CSharpClientGeneratorFactory(settings, document); | ||
} | ||
public static async Task<RefitGenerator> CreateAsync(RefitGeneratorSettings settings) | ||
{ | ||
if (IsHttp(settings.OpenApiPath) && IsYaml(settings.OpenApiPath)) | ||
return new RefitGenerator(settings, await OpenApiYamlDocument.FromUrlAsync(settings.OpenApiPath)); | ||
if (IsHttp(settings.OpenApiPath)) | ||
return new RefitGenerator(settings, await OpenApiDocument.FromUrlAsync(settings.OpenApiPath)); | ||
if (IsYaml(settings.OpenApiPath)) | ||
return new RefitGenerator(settings, await OpenApiYamlDocument.FromFileAsync(settings.OpenApiPath)); | ||
return new RefitGenerator(settings, await OpenApiDocument.FromFileAsync(settings.OpenApiPath)); | ||
} | ||
|
||
public static async Task<RefitGenerator> CreateAsync(RefitGeneratorSettings settings) | ||
{ | ||
if (IsHttp(settings.OpenApiPath) && IsYaml(settings.OpenApiPath)) | ||
return new RefitGenerator(settings, await OpenApiYamlDocument.FromUrlAsync(settings.OpenApiPath)); | ||
if (IsHttp(settings.OpenApiPath)) | ||
return new RefitGenerator(settings, await OpenApiDocument.FromUrlAsync(settings.OpenApiPath)); | ||
if (IsYaml(settings.OpenApiPath)) | ||
return new RefitGenerator(settings, await OpenApiYamlDocument.FromFileAsync(settings.OpenApiPath)); | ||
return new RefitGenerator(settings, await OpenApiDocument.FromFileAsync(settings.OpenApiPath)); | ||
} | ||
public string Generate() | ||
{ | ||
var generator = factory.Create(); | ||
var contracts = RefitInterfaceImports | ||
.GetImportedNamespaces(settings) | ||
.Aggregate( | ||
generator.GenerateFile(), | ||
(current, import) => current.Replace($"{import}.", string.Empty)); | ||
|
||
public string Generate() | ||
{ | ||
var generator = factory.Create(); | ||
var contracts = RefitInterfaceImports | ||
.GetImportedNamespaces(settings) | ||
.Aggregate( | ||
generator.GenerateFile(), | ||
(current, import) => current.Replace($"{import}.", string.Empty)); | ||
var interfaceGenerator = new RefitInterfaceGenerator(settings, document, generator); | ||
var client = GenerateClient(interfaceGenerator); | ||
|
||
var interfaceGenerator = new RefitInterfaceGenerator(settings, document, generator); | ||
var client = GenerateClient(interfaceGenerator); | ||
return new StringBuilder() | ||
.AppendLine(client) | ||
.AppendLine() | ||
.AppendLine(settings.GenerateContracts ? contracts : string.Empty) | ||
.ToString(); | ||
} | ||
|
||
return new StringBuilder() | ||
.AppendLine(client) | ||
.AppendLine() | ||
.AppendLine(settings.GenerateContracts ? contracts : string.Empty) | ||
.ToString(); | ||
} | ||
private string GenerateClient(RefitInterfaceGenerator interfaceGenerator) | ||
{ | ||
var code = new StringBuilder(); | ||
GenerateAutoGeneratedHeader(code); | ||
code.AppendLine(RefitInterfaceImports.GenerateNamespaceImports(settings)) | ||
.AppendLine(); | ||
|
||
private string GenerateClient(RefitInterfaceGenerator interfaceGenerator) | ||
{ | ||
var code = new StringBuilder(); | ||
GenerateAutoGeneratedHeader(code); | ||
code.AppendLine(RefitInterfaceImports.GenerateNamespaceImports(settings)) | ||
.AppendLine(); | ||
code.AppendLine($$""" | ||
namespace {{settings.Namespace}} | ||
{ | ||
{{interfaceGenerator.GenerateRefitInterface()}} | ||
} | ||
"""); | ||
|
||
code.AppendLine("namespace " + settings.Namespace) | ||
.AppendLine("{") | ||
.AppendLine(interfaceGenerator.GenerateRefitInterface()) | ||
.AppendLine("}"); | ||
return code.ToString(); | ||
} | ||
|
||
return code.ToString(); | ||
} | ||
private void GenerateAutoGeneratedHeader(StringBuilder code) | ||
{ | ||
if (!settings.AddAutoGeneratedHeader) | ||
return; | ||
|
||
private void GenerateAutoGeneratedHeader(StringBuilder code) | ||
{ | ||
if (!settings.AddAutoGeneratedHeader) | ||
return; | ||
code.AppendLine(""" | ||
// <auto-generated> | ||
// This code was generated by Refitter. | ||
// </auto-generated> | ||
code.AppendLine("// <auto-generated>") | ||
.AppendLine("// This code was generated by Refitter.") | ||
.AppendLine("// </auto-generated>") | ||
.AppendLine(); | ||
} | ||
"""); | ||
} | ||
|
||
private static bool IsHttp(string path) | ||
{ | ||
return path.StartsWith("http://") || path.StartsWith("https://"); | ||
} | ||
private static bool IsHttp(string path) | ||
{ | ||
return path.StartsWith("http://") || path.StartsWith("https://"); | ||
} | ||
|
||
private static bool IsYaml(string path) | ||
{ | ||
return path.EndsWith("yaml") || path.EndsWith("yml"); | ||
} | ||
private static bool IsYaml(string path) | ||
{ | ||
return path.EndsWith("yaml") || path.EndsWith("yml"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,44 +1,41 @@ | ||
using System.ComponentModel; | ||
using System.Diagnostics.CodeAnalysis; | ||
using System.Runtime.Serialization; | ||
using System.Diagnostics.CodeAnalysis; | ||
|
||
namespace Refitter.Core | ||
namespace Refitter.Core; | ||
|
||
[ExcludeFromCodeCoverage] | ||
public class RefitGeneratorSettings | ||
{ | ||
[ExcludeFromCodeCoverage] | ||
public class RefitGeneratorSettings | ||
{ | ||
public string OpenApiPath { get; set; } = null!; | ||
public string OpenApiPath { get; set; } = null!; | ||
|
||
public string Namespace { get; set; } = "GeneratedCode"; | ||
|
||
public string Namespace { get; set; } = "GeneratedCode"; | ||
public NamingSettings Naming { get; set; } = new(); | ||
|
||
public NamingSettings Naming { get; set; } = new(); | ||
public bool GenerateContracts { get; set; } = true; | ||
|
||
public bool GenerateContracts { get; set; } = true; | ||
public bool GenerateXmlDocCodeComments { get; set; } = true; | ||
|
||
public bool GenerateXmlDocCodeComments { get; set; } = true; | ||
public bool AddAutoGeneratedHeader { get; set; } = true; | ||
|
||
public bool AddAutoGeneratedHeader { get; set; } = true; | ||
public bool ReturnIApiResponse { get; set; } | ||
|
||
public bool ReturnIApiResponse { get; set; } | ||
|
||
public bool GenerateOperationHeaders { get; set; } = true; | ||
public bool GenerateOperationHeaders { get; set; } = true; | ||
|
||
public TypeAccessibility TypeAccessibility { get; set; } = TypeAccessibility.Public; | ||
public TypeAccessibility TypeAccessibility { get; set; } = TypeAccessibility.Public; | ||
|
||
public bool UseCancellationTokens { get; set; } | ||
} | ||
public bool UseCancellationTokens { get; set; } | ||
} | ||
|
||
[ExcludeFromCodeCoverage] | ||
public class NamingSettings | ||
{ | ||
public bool UseOpenApiTitle { get; set; } = true; | ||
[ExcludeFromCodeCoverage] | ||
public class NamingSettings | ||
{ | ||
public bool UseOpenApiTitle { get; set; } = true; | ||
|
||
public string InterfaceName { get; set; } = "ApiClient"; | ||
} | ||
public string InterfaceName { get; set; } = "ApiClient"; | ||
} | ||
|
||
public enum TypeAccessibility | ||
{ | ||
Public, | ||
Internal | ||
} | ||
public enum TypeAccessibility | ||
{ | ||
Public, | ||
Internal | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters