Skip to content

Commit 50ce577

Browse files
authored
Merge pull request #50 from GedasFX/dev
Dev
2 parents df39e21 + e3306ca commit 50ce577

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

Alderto.Web/Helpers/SnowflakeConverter.cs

+41
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
11
using System;
2+
using System.Buffers;
3+
using System.Buffers.Text;
24
using System.Text.Json;
35
using System.Text.Json.Serialization;
46

57
namespace Alderto.Web.Helpers
68
{
79
// Due to number in JavaScript having an upper limit of size (2^53), send all UInt64 as strings.
10+
811
public class SnowflakeConverter : JsonConverter<ulong>
912
{
1013
public override ulong Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1114
{
15+
if (reader.TokenType == JsonTokenType.String)
16+
{
17+
var span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
18+
19+
if (Utf8Parser.TryParse(span, out ulong number, out var bytesConsumed) && span.Length == bytesConsumed)
20+
return number;
21+
22+
if (ulong.TryParse(reader.GetString(), out number))
23+
return number;
24+
}
25+
1226
return reader.GetUInt64();
1327
}
1428

@@ -17,4 +31,31 @@ public override void Write(Utf8JsonWriter writer, ulong value, JsonSerializerOpt
1731
writer.WriteStringValue(value.ToString());
1832
}
1933
}
34+
35+
public class NullableSnowflakeConverter : JsonConverter<ulong?>
36+
{
37+
public override ulong? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
38+
{
39+
if (reader.TokenType == JsonTokenType.String)
40+
{
41+
var span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
42+
43+
if (Utf8Parser.TryParse(span, out ulong number, out var bytesConsumed) && span.Length == bytesConsumed)
44+
return number;
45+
46+
if (ulong.TryParse(reader.GetString(), out number))
47+
return number;
48+
}
49+
50+
if (reader.TryGetUInt64(out var snowflake))
51+
return snowflake;
52+
53+
return null;
54+
}
55+
56+
public override void Write(Utf8JsonWriter writer, ulong? value, JsonSerializerOptions options)
57+
{
58+
writer.WriteStringValue(value?.ToString());
59+
}
60+
}
2061
}

Alderto.Web/Startup.cs

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public void ConfigureServices(IServiceCollection services)
9393
services.AddMvcCore().AddJsonOptions(options =>
9494
{
9595
options.JsonSerializerOptions.Converters.Add(new SnowflakeConverter());
96+
options.JsonSerializerOptions.Converters.Add(new NullableSnowflakeConverter());
9697
});
9798

9899
// In production, the Angular files will be served from this directory

0 commit comments

Comments
 (0)