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 @@ -5,6 +5,7 @@

{{/nrt}}
using System;
using System.Net.Http;

namespace {{packageName}}.{{clientPackage}}
{
Expand Down Expand Up @@ -43,4 +44,17 @@ namespace {{packageName}}.{{clientPackage}}
RawContent = rawContent;
}
}

{{>visibility}} class HttpOperationException : Exception
{
{{>visibility}} HttpRequestMessage Request { get; }
{{>visibility}} HttpResponseMessage Response { get; }

{{>visibility}} HttpOperationException(HttpRequestMessage request, HttpResponseMessage response, string message)
: base(message)
{
Request = request;
Response = response;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ using System;
using System.Diagnostics.CodeAnalysis;
{{/netStandard}}
using System.Net;
using System.Net.Http;

namespace {{packageName}}.{{clientPackage}}
{
Expand Down Expand Up @@ -167,4 +168,53 @@ namespace {{packageName}}.{{clientPackage}}
bool Try{{.}}({{#net60OrLater}}[NotNullWhen(true)]{{/net60OrLater}}out TType{{nrt?}} result);
}
{{/x-http-statuses-with-return}}

{{>visibility}} interface IHttpOperationResponse
{
HttpRequestMessage Request { get; set; }

HttpResponseMessage Response { get; set; }
}
{{>visibility}} interface IHttpOperationResponse<T> : IHttpOperationResponse
{
T Body { get; set; }
}
{{>visibility}} class HttpOperationResponse : IHttpOperationResponse, IDisposable
{
private bool _disposed;

{{>visibility}} HttpRequestMessage Request { get; set; }

{{>visibility}} HttpResponseMessage Response { get; set; }

{{>visibility}} void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
_disposed = true;
if (Request != null)
{
Request.Dispose();
}

if (Response != null)
{
Response.Dispose();
}

Request = null;
Response = null;
}
}
}
{{>visibility}} class HttpOperationResponse<T> : HttpOperationResponse, IHttpOperationResponse<T>, IHttpOperationResponse
{
{{>visibility}} T Body { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,13 @@ using System.Runtime.CompilerServices;
entries.Add(ParameterToString(entry));
return string.Join(",", entries);
}
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
@@ -1,2 +1,2 @@
"yyyy'-'MM'-'dd",
"yyyy-MM-dd",
"yyyyMMdd"
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ 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))
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,7 @@ 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))
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 @@ -43,20 +44,12 @@ namespace {{packageName}}.{{clientPackage}}
_jsonOptions.Converters.Add(new DateOnlyJsonConverter());
_jsonOptions.Converters.Add(new DateOnlyNullableJsonConverter());
{{/supportsDateOnly}}
{{#models}}
{{#model}}
{{#isEnum}}
_jsonOptions.Converters.Add(new {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}JsonConverter());
_jsonOptions.Converters.Add(new {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}NullableJsonConverter());
{{/isEnum}}
{{^isEnum}}
_jsonOptions.Converters.Add(new {{classname}}JsonConverter());
{{/isEnum}}
{{/model}}
{{/models}}
_jsonOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver();

JsonSerializerOptionsProvider jsonSerializerOptionsProvider = new{{^net60OrLater}} JsonSerializerOptionsProvider{{/net60OrLater}}(_jsonOptions);
_services.AddSingleton(jsonSerializerOptionsProvider);
{{#useSourceGeneration}}
_services.AddSingleton(jsonSerializerOptionsProvider.Options);
{{#useSourceGeneration}}

{{#models}}
{{#-first}}
Expand All @@ -66,7 +59,7 @@ namespace {{packageName}}.{{clientPackage}}
{{#lambda.joinLinesWithComma}}
{{#models}}
{{#model}}
new {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}SerializationContext(){{#-last}},{{/-last}}
new {{datatypeWithEnum}}{{^datatypeWithEnum}}{{baseName}}{{/datatypeWithEnum}}SerializationContext(){{#-last}},{{/-last}}
{{/model}}
{{/models}}
{{/lambda.joinLinesWithComma}}
Expand All @@ -79,9 +72,8 @@ namespace {{packageName}}.{{clientPackage}}
{{/models}}

{{/useSourceGeneration}}
_services.AddSingleton<IApiFactory, ApiFactory>();{{#apiInfo}}{{#apis}}
_services.AddSingleton<{{classname}}Events>();
_services.AddTransient<{{interfacePrefix}}{{classname}}, {{classname}}>();{{/apis}}{{/apiInfo}}
_services.AddSingleton<IApiFactory, ApiFactory>();
_services.AddTransient<{{interfacePrefix}}{{clientName}}, {{clientName}}>();
}

/// <summary>
Expand All @@ -99,8 +91,8 @@ namespace {{packageName}}.{{clientPackage}}

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

{{#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;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Text.Json.Serialization;
using {{packageName}}.{{clientPackage}};
using {{packageName}}.{{apiPackage}};

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

/// <summary>
/// </summary>
public partial interface {{interfacePrefix}}{{clientName}}
{
JsonSerializerOptions JsonSerializerOptions { get; }

{{#apiInfo.apis}}
{{interfacePrefix}}{{baseName}} {{baseName}} { get; }
{{/apiInfo.apis}}

}
}

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

public {{clientName}}(
HttpClient httpClient, JsonSerializerOptions? jsonSerializerOptions = null)
{
HttpClient = httpClient;
if (jsonSerializerOptions != null)
{
JsonSerializerOptions = jsonSerializerOptions;
}
else
{
JsonSerializerOptions = new JsonSerializerOptions();
JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());
JsonSerializerOptions.Converters.Add(new DateTimeNullableJsonConverter());
JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
JsonSerializerOptions.Converters.Add(new DateOnlyNullableJsonConverter());
}
{{#apiInfo.apis}}
{{baseName}} = new {{baseName}}(httpClient, JsonSerializerOptions);
{{/apiInfo.apis}}
}

}
}
namespace {{packageName}}.Models
{
/// <summary>
///
/// </summary>
public static class GlobalContext
{
/// <summary>
///
/// </summary>
public static Dictionary<Type, JsonSerializerContext> ContextMapper = new Dictionary<Type, JsonSerializerContext>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace {{packageName}}.Extensions
{
HostConfiguration config = new HostConfiguration(services);

IServiceCollectionExtensions.Add{{apiName}}(services, config);
IServiceCollectionExtensions.Add{{clientName}}(services, config);
});

return builder;
Expand All @@ -46,7 +46,7 @@ namespace {{packageName}}.Extensions

options(context, services, config);

IServiceCollectionExtensions.Add{{apiName}}(services, config);
IServiceCollectionExtensions.Add{{clientName}}(services, config);
});

return builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ namespace {{packageName}}.Extensions
/// Add the api to your host builder.
/// </summary>
/// <param name="services"></param>
public static void Add{{apiName}}(this IServiceCollection services)
public static void Add{{clientName}}(this IServiceCollection services)
{
HostConfiguration config = new{{^net70OrLater}} HostConfiguration{{/net70OrLater}}(services);
Add{{apiName}}(services, config);
Add{{clientName}}(services, config);
}

{{/hasAuthMethods}}
Expand All @@ -32,14 +32,14 @@ namespace {{packageName}}.Extensions
/// </summary>
/// <param name="services"></param>
/// <param name="options"></param>
public static void Add{{apiName}}(this IServiceCollection services, Action<HostConfiguration> options)
public static void Add{{clientName}}(this IServiceCollection services, Action<HostConfiguration> options)
{
HostConfiguration config = new{{^net70OrLater}} HostConfiguration{{/net70OrLater}}(services);
options(config);
Add{{apiName}}(services, config);
Add{{clientName}}(services, config);
}

internal static void Add{{apiName}}(IServiceCollection services, HostConfiguration host)
internal static void Add{{clientName}}(IServiceCollection services, HostConfiguration host)
{
if (!host.HttpClientsAdded)
host.Add{{apiName}}HttpClients();
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#model.allVars}}{{^isDiscriminator}}{{^required}}Option<{{/required}}{{{datatypeWithEnum}}}{{>NullConditionalProperty}}{{^required}}>{{/required}} {{#lambda.escape_reserved_word}}{{#lambda.camel_case}}{{name}}{{/lambda.camel_case}}{{/lambda.escape_reserved_word}}{{#defaultValue}} = {{^required}}default{{/required}}{{#required}}{{^isDateTime}}{{#isString}}{{^isEnum}}@{{/isEnum}}{{/isString}}{{{.}}}{{/isDateTime}}{{#isDateTime}}default{{/isDateTime}}{{/required}}{{/defaultValue}}{{^defaultValue}}{{#lambda.first}}{{#isNullable}} = default {{/isNullable}}{{^required}} = default {{/required}}{{/lambda.first}}{{/defaultValue}} {{/isDiscriminator}}{{/model.allVars}}
{{#model.allVars}}{{^isDiscriminator}}{{{datatypeWithEnum}}}{{#isEnum}}{{#lambda.first}}{{#isNullable}}{{>NullConditionalProperty}} {{/isNullable}}{{^required}}{{nrt?}}{{^nrt}}{{#vendorExtensions.x-is-value-type}}?{{/vendorExtensions.x-is-value-type}}{{/nrt}} {{/required}}{{/lambda.first}}{{/isEnum}}{{^isEnum}}{{#isNullable}}{{>NullConditionalProperty}}{{/isNullable}}{{/isEnum}} {{#lambda.escape_reserved_word}}{{#lambda.camel_case}}{{name}}{{/lambda.camel_case}}{{/lambda.escape_reserved_word}}{{#defaultValue}} = {{^required}}default{{/required}}{{#required}}{{^isDateTime}}{{#isString}}{{^isEnum}}@{{/isEnum}}{{/isString}}{{{.}}}{{/isDateTime}}{{#isDateTime}}default{{/isDateTime}}{{/required}}{{/defaultValue}}{{^defaultValue}}{{#lambda.first}}{{#isNullable}} = default {{/isNullable}}{{^required}}{{#isEnum}} = null{{/isEnum}}{{^isEnum}} = default{{/isEnum}} {{/required}}{{/lambda.first}}{{/defaultValue}} {{/isDiscriminator}}{{/model.allVars}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#lambda.joinWithComma}}{{#allParams}}{{#required}}{{{dataType}}}{{>NullConditionalParameter}}{{/required}}{{^required}}Option<{{{dataType}}}{{>NullConditionalParameter}}>{{/required}} {{paramName}}{{#notRequiredOrIsNullable}} = default{{/notRequiredOrIsNullable}} {{/allParams}}System.Threading.CancellationToken cancellationToken = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}}{{/lambda.joinWithComma}}
{{#lambda.joinWithComma}}{{#allParams}}{{{dataType}}}{{>NullConditionalParameter}} {{paramName}}{{#notRequiredOrIsNullable}} = default{{/notRequiredOrIsNullable}} {{/allParams}}System.Threading.CancellationToken cancellationToken = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}}{{/lambda.joinWithComma}}
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