Skip to content

Commit 773019a

Browse files
MnatsakanMargaryanMnatsakanMargaryan
authored andcommitted
new json covnerters added to reduce code reduncancy across projects
1 parent 13c8ee0 commit 773019a

File tree

5 files changed

+164
-26
lines changed

5 files changed

+164
-26
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace SharedKernel.JsonConverters;
5+
6+
public class CustomDateOnlyConverter : JsonConverter<DateOnly>
7+
{
8+
private const string DateFormat = "dd-MM-yyyy";
9+
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
10+
{
11+
var dateString = reader.GetString();
12+
13+
if (DateOnly.TryParseExact(dateString, DateFormat, null, System.Globalization.DateTimeStyles.None, out var date))
14+
{
15+
return date;
16+
}
17+
18+
throw new JsonException($"Unable to parse date: {dateString}");
19+
}
20+
21+
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
22+
{
23+
writer.WriteStringValue(value.ToString(DateFormat));
24+
}
25+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
using System.Threading.Tasks;
8+
9+
namespace SharedKernel.JsonConverters;
10+
11+
public class EnumConverterFactory : JsonConverterFactory
12+
{
13+
public override bool CanConvert(Type typeToConvert)
14+
{
15+
return typeToConvert.IsEnum ||
16+
(Nullable.GetUnderlyingType(typeToConvert)?.IsEnum ?? false);
17+
}
18+
19+
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
20+
{
21+
var underlyingType = Nullable.GetUnderlyingType(typeToConvert);
22+
if (underlyingType != null) // It's a nullable enum
23+
{
24+
Type converterType = typeof(NullableEnumConverter<>).MakeGenericType(underlyingType);
25+
return (JsonConverter)Activator.CreateInstance(converterType)!;
26+
}
27+
else // Non-nullable enum
28+
{
29+
Type converterType = typeof(NonNullableEnumConverter<>).MakeGenericType(typeToConvert);
30+
return (JsonConverter)Activator.CreateInstance(converterType)!;
31+
}
32+
}
33+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace SharedKernel.JsonConverters;
5+
6+
public class NonNullableEnumConverter<T> : JsonConverter<T> where T : struct, Enum
7+
{
8+
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
9+
{
10+
if (reader.TokenType == JsonTokenType.String)
11+
{
12+
var enumString = reader.GetString();
13+
if (Enum.TryParse(enumString, true, out T result))
14+
{
15+
return result;
16+
}
17+
}
18+
else if (reader.TokenType == JsonTokenType.Number)
19+
{
20+
int enumValue = reader.GetInt32();
21+
if (Enum.IsDefined(typeof(T), enumValue))
22+
{
23+
return (T)Enum.ToObject(typeof(T), enumValue);
24+
}
25+
}
26+
27+
throw new JsonException($"Unable to convert value to enum {typeof(T)}");
28+
}
29+
30+
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
31+
{
32+
writer.WriteStringValue(value.ToString());
33+
}
34+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace SharedKernel.JsonConverters;
5+
6+
public class NullableEnumConverter<T> : JsonConverter<T?> where T : struct, Enum
7+
{
8+
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
9+
{
10+
if (reader.TokenType == JsonTokenType.Null)
11+
{
12+
return null;
13+
}
14+
15+
if (reader.TokenType == JsonTokenType.String)
16+
{
17+
var enumString = reader.GetString();
18+
if (Enum.TryParse(enumString, true, out T result))
19+
{
20+
return result;
21+
}
22+
}
23+
else if (reader.TokenType == JsonTokenType.Number)
24+
{
25+
int enumValue = reader.GetInt32();
26+
if (Enum.IsDefined(typeof(T), enumValue))
27+
{
28+
return (T)Enum.ToObject(typeof(T), enumValue);
29+
}
30+
}
31+
32+
throw new JsonException($"Unable to convert value to nullable enum {typeof(T)}");
33+
}
34+
35+
public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options)
36+
{
37+
if (value.HasValue)
38+
{
39+
writer.WriteStringValue(value.Value.ToString());
40+
}
41+
else
42+
{
43+
writer.WriteNullValue();
44+
}
45+
}
46+
}

src/SharedKernel/SharedKernel.csproj

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,56 @@
88
<PackageReadmeFile>Readme.md</PackageReadmeFile>
99
<Authors>Pandatech</Authors>
1010
<Copyright>MIT</Copyright>
11-
<Version>1.8.10</Version>
11+
<Version>1.9.0</Version>
1212
<PackageId>Pandatech.SharedKernel</PackageId>
1313
<Title>Pandatech Shared Kernel Library</Title>
1414
<PackageTags>Pandatech, shared kernel, library, OpenAPI, Swagger, utilities, scalar</PackageTags>
1515
<Description>Pandatech.SharedKernel provides centralized configurations, utilities, and extensions for ASP.NET Core projects. For more information refere to readme.md document.</Description>
1616
<RepositoryUrl>https://github.com/PandaTechAM/be-lib-sharedkernel</RepositoryUrl>
17-
<PackageReleaseNotes>nuget updates</PackageReleaseNotes>
17+
<PackageReleaseNotes>New json covnerters added to reduce code reduncancy across projects.</PackageReleaseNotes>
1818
</PropertyGroup>
1919

2020
<ItemGroup>
21-
<None Include="..\..\pandatech.png" Pack="true" PackagePath="\"/>
22-
<None Include="..\..\Readme.md" Pack="true" PackagePath="\"/>
21+
<None Include="..\..\pandatech.png" Pack="true" PackagePath="\" />
22+
<None Include="..\..\Readme.md" Pack="true" PackagePath="\" />
2323
</ItemGroup>
2424

2525
<ItemGroup>
26-
<EmbeddedResource Include="OpenApi\UiAssets\**\*"/>
26+
<EmbeddedResource Include="OpenApi\UiAssets\**\*" />
2727
</ItemGroup>
2828

2929
<ItemGroup>
30-
<PackageReference Include="AspNetCore.HealthChecks.Prometheus.Metrics" Version="9.0.0"/>
31-
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="9.0.0"/>
32-
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="9.0.0"/>
33-
<PackageReference Include="FluentDateTime" Version="3.0.0"/>
34-
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0"/>
35-
<PackageReference Include="HtmlSanitizer" Version="9.0.886"/>
36-
<PackageReference Include="MediatR" Version="[12.5.0]"/>
37-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8"/>
38-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8"/>
39-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="9.0.8"/>
40-
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.8"/>
41-
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.8.0"/>
30+
<PackageReference Include="AspNetCore.HealthChecks.Prometheus.Metrics" Version="9.0.0" />
31+
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="9.0.0" />
32+
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="9.0.0" />
33+
<PackageReference Include="FluentDateTime" Version="3.0.0" />
34+
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
35+
<PackageReference Include="HtmlSanitizer" Version="9.0.886" />
36+
<PackageReference Include="MediatR" Version="[12.5.0]" />
37+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8" />
38+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8" />
39+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="9.0.8" />
40+
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.8" />
41+
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.8.0" />
4242
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.13.1" />
43-
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1"/>
43+
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1" />
4444
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.13.1" />
4545
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.13.0" />
46-
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.12"/>
46+
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.12" />
4747
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.13.0" />
4848
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.13.0" />
4949
<PackageReference Include="Pandatech.CommissionCalculator" Version="4.0.1" />
5050
<PackageReference Include="Pandatech.Crypto" Version="6.1.1" />
51-
<PackageReference Include="Pandatech.DistributedCache" Version="4.0.9"/>
51+
<PackageReference Include="Pandatech.DistributedCache" Version="4.0.9" />
5252
<PackageReference Include="PandaTech.FileExporter" Version="5.0.3" />
53-
<PackageReference Include="PandaTech.FluentImporter" Version="3.0.9"/>
54-
<PackageReference Include="Pandatech.FluentMinimalApiMapper" Version="2.0.4"/>
55-
<PackageReference Include="Pandatech.PandaVaultClient" Version="4.0.6"/>
53+
<PackageReference Include="PandaTech.FluentImporter" Version="3.0.9" />
54+
<PackageReference Include="Pandatech.FluentMinimalApiMapper" Version="2.0.4" />
55+
<PackageReference Include="Pandatech.PandaVaultClient" Version="4.0.6" />
5656
<PackageReference Include="Pandatech.ResponseCrafter" Version="5.3.0" />
5757
<PackageReference Include="Scalar.AspNetCore" Version="2.9.0" />
58-
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0"/>
59-
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0"/>
60-
<PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.3.1"/>
58+
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
59+
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
60+
<PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.3.1" />
6161
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.6" />
6262
</ItemGroup>
6363

0 commit comments

Comments
 (0)