Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,14 @@ using System.Runtime.CompilerServices;
entries.Add(ParameterToString(entry));
return string.Join(",", entries);
}
// DNV customization: Add parameter type IEnumerable
else if (obj is IEnumerable enumerable)
{
List<string{{nrt?}}> entries = new{{^net70OrLater}} List<string{{nrt?}}>{{/net70OrLater}}();
foreach (var entry in enumerable)
entries.Add(ParameterToString(entry));
return string.Join(",", entries);
}

return Convert.ToString(obj, System.Globalization.CultureInfo.InvariantCulture);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ namespace {{packageName}}.{{clientPackage}}
string value = reader.GetString(){{nrt!}};

foreach(string format in Formats)
if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateOnly result))
// DNV customization: DateOnly is irrelevant to time zone.
if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result))
return result;

throw new NotSupportedException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ namespace {{packageName}}.{{clientPackage}}
string value = reader.GetString(){{nrt!}};

foreach(string format in Formats)
if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateOnly result))
// DNV customization: DateOnly is irrelevant to time zone.
if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateOnly result))
return result;

throw new NotSupportedException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ using {{packageName}}.{{apiPackage}};
using {{packageName}}.{{modelPackage}};
{{/-first}}
{{/models}}
using System.Text.Json.Serialization.Metadata;

namespace {{packageName}}.{{clientPackage}}
{
Expand Down Expand Up @@ -54,6 +55,8 @@ namespace {{packageName}}.{{clientPackage}}
{{/isEnum}}
{{/model}}
{{/models}}
// DNV customization: Use default resolver to support AOT
_jsonOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver();
JsonSerializerOptionsProvider jsonSerializerOptionsProvider = new{{^net60OrLater}} JsonSerializerOptionsProvider{{/net60OrLater}}(_jsonOptions);
_services.AddSingleton(jsonSerializerOptionsProvider);
{{#useSourceGeneration}}
Expand Down Expand Up @@ -82,25 +85,39 @@ namespace {{packageName}}.{{clientPackage}}
_services.AddSingleton<IApiFactory, ApiFactory>();{{#apiInfo}}{{#apis}}
_services.AddSingleton<{{classname}}Events>();
_services.AddTransient<{{interfacePrefix}}{{classname}}, {{classname}}>();{{/apis}}{{/apiInfo}}
// DNV customization: Inject api client object.
_services.AddTransient<{{interfacePrefix}}{{clientName}}, {{clientName}}>();
}

/// <summary>
/// Configures the HttpClients.
/// </summary>
/// <param name="client"></param>
/// <param name="name"></param>
/// <param name="builder"></param>
/// <returns></returns>
public HostConfiguration Add{{apiName}}HttpClients
(
Action<HttpClient>{{nrt?}} client = null, Action<IHttpClientBuilder>{{nrt?}} builder = null)
public HostConfiguration Add{{apiName}}HttpClients(
Action<HttpClient>{{nrt?}} client = null, string? name = null, Action<IHttpClientBuilder>{{nrt?}} builder = null)
{
if (client == null)
client = c => c.BaseAddress = new Uri(ClientUtils.BASE_ADDRESS);

List<IHttpClientBuilder> builders = new List<IHttpClientBuilder>();

{{#apiInfo}}{{#apis}}builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{classname}}, {{classname}}>(client));
{{/apis}}{{/apiInfo}}
// DNV customization: Add Http client for api client
// DNV customization: Add name for http client
if (!string.IsNullOrEmpty(name))
{
{{#apiInfo}}{{#apis}}builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{classname}}, {{classname}}>(name, client));
{{/apis}}{{/apiInfo}}
builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{clientName}}, {{clientName}}>(name, client));
}
else
{
{{#apiInfo}}{{#apis}}builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{classname}}, {{classname}}>(client));
{{/apis}}{{/apiInfo}}
builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{clientName}}, {{clientName}}>(client));
}
if (builder != null)
foreach (IHttpClientBuilder instance in builders)
builder(instance);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
using System.Net.Http;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using {{packageName}}.{{clientPackage}};
using {{packageName}}.{{apiPackage}};
using {{packageName}}.{{modelPackage}};

namespace {{packageName}}.{{apiPackage}}
{
Expand All @@ -12,4 +18,63 @@ namespace {{packageName}}.{{apiPackage}}
/// </summary>
HttpClient HttpClient { get; }
}

// DNV customization: Add client interface/object
/// <summary>
/// </summary>
public partial interface {{interfacePrefix}}{{clientName}}
{
{{#apiInfo.apis}}
{{interfacePrefix}}{{classname}} {{classname}} { get; }
{{/apiInfo.apis}}
}
}

namespace {{packageName}}
{
public class {{clientName}} : {{interfacePrefix}}{{clientName}}
{
public HttpClient HttpClient { get; }
public JsonSerializerOptionsProvider JsonSerializerOptionsProvider { get; private set; }
{{#apiInfo.apis}}
{{>visibility}} virtual {{interfacePrefix}}{{classname}} {{classname}} { get; private set; }
{{/apiInfo.apis}}

public {{clientName}}(
HttpClient httpClient, {{#apiInfo.apis}}{{interfacePrefix}}{{classname}} {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}, {{/apiInfo.apis}}JsonSerializerOptionsProvider? jsonSerializerOptionsProvider = null)
{
HttpClient = httpClient;
{{#apiInfo.apis}}
{{classname}} = {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}};
{{/apiInfo.apis}}
if (jsonSerializerOptionsProvider != null)
{
JsonSerializerOptionsProvider = jsonSerializerOptionsProvider;
}
else
{
var jsonSerializerOptions = new JsonSerializerOptions();
jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
jsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());
jsonSerializerOptions.Converters.Add(new DateTimeNullableJsonConverter());
{{#supportsDateOnly}}
jsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
jsonSerializerOptions.Converters.Add(new DateOnlyNullableJsonConverter());
{{/supportsDateOnly}}
{{#models}}
{{#model}}
{{#isEnum}}
jsonSerializerOptions.Converters.Add(new {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}JsonConverter());
jsonSerializerOptions.Converters.Add(new {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}NullableJsonConverter());
{{/isEnum}}
{{^isEnum}}
jsonSerializerOptions.Converters.Add(new {{classname}}JsonConverter());
{{/isEnum}}
{{/model}}
{{/models}}
jsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver();
JsonSerializerOptionsProvider = new JsonSerializerOptionsProvider(jsonSerializerOptions);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,40 @@
{{/isDateTime}}
{{#isEnum}}
{{^isMap}}
// DNV customization (candidate): Handle enum by value
/*
"EnumByValue": {
"enum": [
100,
200
],
"type": "integer",
"format": "int32",
"x-enum-descriptions": [
"",
""
],
"x-enum-varnames": [
"A",
"B"
],
"description": "\n\n100 - A\n\n200 - B"
},*/
/* {{#allowableValues}}{{#enumVars}}{{#-first}}{{#isString}}
{{^isNumeric}}
string{{nrt?}} {{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}}RawValue = utf8JsonReader.GetString();
{{^isInnerEnum}}
if ({{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}}RawValue != null)
{{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}} = {{>OptionProperty}}{{{datatypeWithEnum}}}ValueConverter.FromStringOrDefault({{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}}RawValue));
{{/isInnerEnum}}
{{#isInnerEnum}}
if ({{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}}RawValue != null)
{{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}} = {{>OptionProperty}}{{classname}}.{{{datatypeWithEnum}}}FromStringOrDefault({{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}}RawValue));
{{/isInnerEnum}}
{{/isNumeric}}
{{/isString}}{{#isNumeric}}
{{#lambda.camelcase_sanitize_param}}{{baseName}}{{/lambda.camelcase_sanitize_param}} = {{>OptionProperty}}utf8JsonReader.TokenType == JsonTokenType.Null ? ({{#isInnerEnum}}{{classname}}.{{/isInnerEnum}}{{{datatypeWithEnum}}}?)null : ({{#isInnerEnum}}{{classname}}.{{/isInnerEnum}}{{{datatypeWithEnum}}})utf8JsonReader.Get{{#vendorExtensions.x-unsigned}}U{{/vendorExtensions.x-unsigned}}Int32());
{{/isNumeric}}{{/-first}}{{/enumVars}}{{/allowableValues}}*/
{{#isNumeric}}
{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} = {{>OptionProperty}}utf8JsonReader.TokenType == JsonTokenType.Null ? ({{#isInnerEnum}}{{classname}}.{{/isInnerEnum}}{{{datatypeWithEnum}}}?)null : ({{#isInnerEnum}}{{classname}}.{{/isInnerEnum}}{{{datatypeWithEnum}}})utf8JsonReader.Get{{#vendorExtensions.x-unsigned}}U{{/vendorExtensions.x-unsigned}}Int32());
{{/isNumeric}}
Expand Down Expand Up @@ -338,9 +372,7 @@
public override void Write(Utf8JsonWriter writer, {{classname}} {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}, JsonSerializerOptions jsonSerializerOptions)
{
{{#lambda.trimLineBreaks}}
{{#lambda.copyText}}
{{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}
{{/lambda.copyText}}
{{#lambda.copyText}}{{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}{{/lambda.copyText}}
{{#discriminator}}
{{#children}}
if ({{#lambda.paste}}{{/lambda.paste}} is {{classname}} {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}){
Expand Down Expand Up @@ -520,9 +552,7 @@
{{/isNullable}}
{{/isInnerEnum}}
{{^isInnerEnum}}
{{#lambda.copyText}}
{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}
{{/lambda.copyText}}
{{#lambda.copyText}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{/lambda.copyText}}
{{#required}}
{{#isNullable}}
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,11 @@ namespace {{packageName}}.{{clientPackage}}
/// <param name="value"></param>
public Option(TType value)
{
IsSet = true;
Value = value;
if (value != null)
{
IsSet = true;
Value = value;
}
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,8 @@ using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using {{packageName}}.Api;
using {{packageName}}.Client;
using {{packageName}}.Model;
using {{packageName}}.Extensions;
using {{packageName}}.Interfaces;

namespace YourProject
{
Expand All @@ -61,13 +60,13 @@ namespace YourProject
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();{{#apiInfo}}{{#apis}}{{#-first}}
var api = host.Services.GetRequiredService<{{interfacePrefix}}{{classname}}>();
var api = host.Services.GetRequiredService<{{interfacePrefix}}{{clientName}}>();
{{#operations}}
{{#-first}}
{{#operation}}
{{#-first}}
{{operationId}}ApiResponse apiResponse = await api.{{operationId}}Async("todo");
{{#returnType}}{{{.}}}{{/returnType}}{{^returnType}}object{{/returnType}} model = apiResponse.Ok();
var apiResponse = await api.{{baseName}}.{{#vendorExtensions.x-csharp-operationId}}{{vendorExtensions.x-csharp-operationId}}{{/vendorExtensions.x-csharp-operationId}}{{^vendorExtensions.x-csharp-operationId}}{{operationId}}{{/vendorExtensions.x-csharp-operationId}}Async("todo");
Console.WriteLine($"Response: {apiResponse.ToString()}");
{{/-first}}
{{/operation}}
{{/-first}}
Expand All @@ -78,7 +77,7 @@ namespace YourProject
}

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.Configure{{apiName}}((context, options) =>
.Configure{{apiName}}((context, services, options) =>
{
{{#authMethods}}
{{#-first}}
Expand All @@ -96,7 +95,9 @@ namespace YourProject
// your custom converters if any
});

options.Add{{apiName}}HttpClients(builder: builder => builder
options.Add{{apiName}}HttpClients(
client: client => client.BaseAddress = new Uri(context.Configuration["ApiSettings:BaseAddress"]),
builder: builder => builder
.AddRetryPolicy(2)
.AddTimeoutPolicy(TimeSpan.FromSeconds(5))
.AddCircuitBreakerPolicy(10, TimeSpan.FromSeconds(30))
Expand Down Expand Up @@ -138,7 +139,7 @@ All URIs are relative to *{{{basePath}}}*

Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}
*{{classname}}* | [**{{operationId}}**]({{apiDocPath}}{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{{summary}}}{{/summary}}{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}{{/apiDocs}}{{#modelDocs}}
*{{classname}}* | [**{{#vendorExtensions.x-csharp-operationId}}{{vendorExtensions.x-csharp-operationId}}{{/vendorExtensions.x-csharp-operationId}}{{^vendorExtensions.x-csharp-operationId}}{{operationId}}{{/vendorExtensions.x-csharp-operationId}}**]({{apiDocPath}}{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{{summary}}}{{/summary}}{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}{{/apiDocs}}{{#modelDocs}}

<a id="documentation-for-models"></a>
## Documentation for Models
Expand Down
Loading
Loading