Skip to content

Commit 2f7b1df

Browse files
committed
Abstract over json converter
1 parent c523a11 commit 2f7b1df

File tree

4 files changed

+62
-29
lines changed

4 files changed

+62
-29
lines changed
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
// Copyright © WireMock.Net
22

3-
using Newtonsoft.Json;
3+
using JsonConverter.Abstractions;
44

55
namespace WireMock.Net.Extensions.Routing.Extensions;
66

77
internal static class RequestMessageExtensions
88
{
99
public static T? GetBodyAsJson<T>(
10-
this IRequestMessage requestMessage, JsonSerializerSettings? settings = null) =>
10+
this IRequestMessage requestMessage,
11+
IJsonConverter jsonConverter,
12+
JsonConverterOptions? jsonOptions = null) =>
1113
requestMessage.Body is not null
12-
? JsonConvert.DeserializeObject<T>(requestMessage.Body, settings)
14+
? jsonConverter.Deserialize<T>(requestMessage.Body, jsonOptions)
1315
: default;
1416
}

src/WireMock.Net.Extensions.Routing/Extensions/WireMockRouterExtensions.cs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Copyright © WireMock.Net
22

3+
using JsonConverter.Abstractions;
4+
using Microsoft.Extensions.Options;
35
using Newtonsoft.Json;
46
using WireMock.Net.Extensions.Routing.Models;
57

@@ -69,14 +71,16 @@ public static WireMockRouter MapPost(
6971
/// <param name="source">The router to extend.</param>
7072
/// <param name="pattern">The route pattern.</param>
7173
/// <param name="requestHandler">The request handler function.</param>
72-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
74+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
75+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
7376
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
7477
public static WireMockRouter MapPost<TRequest>(
7578
this WireMockRouter source,
7679
string pattern,
7780
Func<WireMockRequestInfo<TRequest>, object?> requestHandler,
78-
JsonSerializerSettings? jsonSettings = null) =>
79-
source.Map(HttpMethod.Post.Method, pattern, requestHandler, jsonSettings);
81+
IJsonConverter? jsonConverter = null,
82+
JsonConverterOptions? jsonOptions = null) =>
83+
source.Map(HttpMethod.Post.Method, pattern, requestHandler, jsonConverter, jsonOptions);
8084

8185
/// <summary>
8286
/// Maps a POST request to an asynchronous request handler with a typed body.
@@ -85,14 +89,16 @@ public static WireMockRouter MapPost<TRequest>(
8589
/// <param name="source">The router to extend.</param>
8690
/// <param name="pattern">The route pattern.</param>
8791
/// <param name="requestHandler">The asynchronous request handler function.</param>
88-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
92+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
93+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
8994
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
9095
public static WireMockRouter MapPost<TRequest>(
9196
this WireMockRouter source,
9297
string pattern,
9398
Func<WireMockRequestInfo<TRequest>, Task<object?>> requestHandler,
94-
JsonSerializerSettings? jsonSettings = null) =>
95-
source.Map(HttpMethod.Post.Method, pattern, requestHandler, jsonSettings);
99+
IJsonConverter? jsonConverter = null,
100+
JsonConverterOptions? jsonOptions = null) =>
101+
source.Map(HttpMethod.Post.Method, pattern, requestHandler, jsonConverter, jsonOptions);
96102

97103
/// <summary>
98104
/// Maps a PUT request to a synchronous request handler.
@@ -127,14 +133,16 @@ public static WireMockRouter MapPut(
127133
/// <param name="source">The router to extend.</param>
128134
/// <param name="pattern">The route pattern.</param>
129135
/// <param name="requestHandler">The request handler function.</param>
130-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
136+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
137+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
131138
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
132139
public static WireMockRouter MapPut<TRequest>(
133140
this WireMockRouter source,
134141
string pattern,
135142
Func<WireMockRequestInfo<TRequest>, object?> requestHandler,
136-
JsonSerializerSettings? jsonSettings = null) =>
137-
source.Map(HttpMethod.Put.Method, pattern, requestHandler, jsonSettings);
143+
IJsonConverter? jsonConverter = null,
144+
JsonConverterOptions? jsonOptions = null) =>
145+
source.Map(HttpMethod.Put.Method, pattern, requestHandler, jsonConverter, jsonOptions);
138146

139147
/// <summary>
140148
/// Maps a PUT request to an asynchronous request handler with a typed body.
@@ -143,14 +151,16 @@ public static WireMockRouter MapPut<TRequest>(
143151
/// <param name="source">The router to extend.</param>
144152
/// <param name="pattern">The route pattern.</param>
145153
/// <param name="requestHandler">The asynchronous request handler function.</param>
146-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
154+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
155+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
147156
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
148157
public static WireMockRouter MapPut<TRequest>(
149158
this WireMockRouter source,
150159
string pattern,
151160
Func<WireMockRequestInfo<TRequest>, Task<object?>> requestHandler,
152-
JsonSerializerSettings? jsonSettings = null) =>
153-
source.Map(HttpMethod.Put.Method, pattern, requestHandler, jsonSettings);
161+
IJsonConverter? jsonConverter = null,
162+
JsonConverterOptions? jsonOptions = null) =>
163+
source.Map(HttpMethod.Put.Method, pattern, requestHandler, jsonConverter, jsonOptions);
154164

155165
/// <summary>
156166
/// Maps a DELETE request to a synchronous request handler.
@@ -185,14 +195,16 @@ public static WireMockRouter MapDelete(
185195
/// <param name="source">The router to extend.</param>
186196
/// <param name="pattern">The route pattern.</param>
187197
/// <param name="requestHandler">The request handler function.</param>
188-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
198+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
199+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
189200
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
190201
public static WireMockRouter MapDelete<TRequest>(
191202
this WireMockRouter source,
192203
string pattern,
193204
Func<WireMockRequestInfo<TRequest>, object?> requestHandler,
194-
JsonSerializerSettings? jsonSettings = null) =>
195-
source.Map(HttpMethod.Delete.Method, pattern, requestHandler, jsonSettings);
205+
IJsonConverter? jsonConverter = null,
206+
JsonConverterOptions? jsonOptions = null) =>
207+
source.Map(HttpMethod.Delete.Method, pattern, requestHandler, jsonConverter, jsonOptions);
196208

197209
/// <summary>
198210
/// Maps a DELETE request to an asynchronous request handler with a typed body.
@@ -201,12 +213,14 @@ public static WireMockRouter MapDelete<TRequest>(
201213
/// <param name="source">The router to extend.</param>
202214
/// <param name="pattern">The route pattern.</param>
203215
/// <param name="requestHandler">The asynchronous request handler function.</param>
204-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
216+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
217+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
205218
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
206219
public static WireMockRouter MapDelete<TRequest>(
207220
this WireMockRouter source,
208221
string pattern,
209222
Func<WireMockRequestInfo<TRequest>, Task<object?>> requestHandler,
210-
JsonSerializerSettings? jsonSettings = null) =>
211-
source.Map(HttpMethod.Delete.Method, pattern, requestHandler, jsonSettings);
223+
IJsonConverter? jsonConverter = null,
224+
JsonConverterOptions? jsonOptions = null) =>
225+
source.Map(HttpMethod.Delete.Method, pattern, requestHandler, jsonConverter, jsonOptions);
212226
}

src/WireMock.Net.Extensions.Routing/WireMock.Net.Extensions.Routing.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<Description>WireMock.Net.Routing extends WireMock.Net with modern, minimal-API-style routing for .NET</Description>
44
<Authors>Gennadii Saltyshchak</Authors>
@@ -20,6 +20,10 @@
2020
<None Include="..\..\README.md" Link="README.md" Pack="true" PackagePath="" />
2121
</ItemGroup>
2222

23+
<ItemGroup>
24+
<PackageReference Include="JsonConverter.Newtonsoft.Json" Version="0.7.0" />
25+
</ItemGroup>
26+
2327
<ItemGroup>
2428
<ProjectReference Include="..\WireMock.Net.Minimal\WireMock.Net.Minimal.csproj" />
2529
</ItemGroup>

src/WireMock.Net.Extensions.Routing/WireMockRouter.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Copyright © WireMock.Net
22

3+
using JsonConverter.Abstractions;
4+
using JsonConverter.Newtonsoft.Json;
35
using Microsoft.AspNetCore.Http;
46
using Microsoft.Extensions.DependencyInjection;
57
using Newtonsoft.Json;
@@ -30,9 +32,14 @@ public sealed class WireMockRouter(WireMockServer server)
3032
public IReadOnlyCollection<WireMockMiddleware> MiddlewareCollection { get; init; } = [];
3133

3234
/// <summary>
33-
/// Gets or initializes the default JSON serializer settings for the router.
35+
/// Gets or initializes the default <see cref="IJsonConverter"/>.
3436
/// </summary>
35-
public JsonSerializerSettings? DefaultJsonSettings { get; init; }
37+
public IJsonConverter DefaultJsonConverter { get; init; } = new NewtonsoftJsonConverter();
38+
39+
/// <summary>
40+
/// Gets or initializes the default JSON converter options for the router.
41+
/// </summary>
42+
public JsonConverterOptions? DefaultJsonOptions { get; init; }
3643

3744
/// <summary>
3845
/// Maps a route to a synchronous request handler.
@@ -73,16 +80,18 @@ public WireMockRouter Map(
7380
/// <param name="method">The HTTP method.</param>
7481
/// <param name="pattern">The route pattern.</param>
7582
/// <param name="requestHandler">The request handler function.</param>
76-
/// <param name="jsonSettings">Optional JSON serializer settings.</param>
83+
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
84+
/// <param name="jsonOptions">The <see cref="JsonConverterOptions"/> [optional].</param>
7785
/// <returns>The current <see cref="WireMockRouter"/> instance.</returns>
7886
public WireMockRouter Map<TRequest>(
7987
string method,
8088
string pattern,
8189
Func<WireMockRequestInfo<TRequest>, object?> requestHandler,
82-
JsonSerializerSettings? jsonSettings = null)
90+
IJsonConverter? jsonConverter = null,
91+
JsonConverterOptions? jsonOptions = null)
8392
{
8493
object? CreateBody(IRequestMessage request) =>
85-
requestHandler(CreateRequestInfo<TRequest>(request, pattern, jsonSettings));
94+
requestHandler(CreateRequestInfo<TRequest>(request, pattern, jsonConverter, jsonOptions));
8695

8796
return Map(method, pattern, CreateBody);
8897
}
@@ -116,13 +125,17 @@ private static HttpContext CreateHttpContext() =>
116125
};
117126

118127
private WireMockRequestInfo<TRequest> CreateRequestInfo<TRequest>(
119-
IRequestMessage request, string pattern, JsonSerializerSettings? jsonSettings = null)
128+
IRequestMessage request,
129+
string pattern,
130+
IJsonConverter? jsonConverter = null,
131+
JsonConverterOptions? jsonOptions = null)
120132
{
121133
var requestInfo = CreateRequestInfo(request, pattern);
122134
return new WireMockRequestInfo<TRequest>(requestInfo.Request)
123135
{
124136
RouteArgs = requestInfo.RouteArgs,
125-
Body = requestInfo.Request.GetBodyAsJson<TRequest>(jsonSettings ?? DefaultJsonSettings),
137+
Body = requestInfo.Request.GetBodyAsJson<TRequest>(
138+
jsonConverter ?? DefaultJsonConverter, jsonOptions ?? DefaultJsonOptions),
126139
};
127140
}
128141

0 commit comments

Comments
 (0)