1
1
using System ;
2
+ using System . Buffers ;
3
+ using System . Buffers . Text ;
2
4
using System . Text . Json ;
3
5
using System . Text . Json . Serialization ;
4
6
5
7
namespace Alderto . Web . Helpers
6
8
{
7
9
// Due to number in JavaScript having an upper limit of size (2^53), send all UInt64 as strings.
10
+
8
11
public class SnowflakeConverter : JsonConverter < ulong >
9
12
{
10
13
public override ulong Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
11
14
{
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
+
12
26
return reader . GetUInt64 ( ) ;
13
27
}
14
28
@@ -17,4 +31,31 @@ public override void Write(Utf8JsonWriter writer, ulong value, JsonSerializerOpt
17
31
writer . WriteStringValue ( value . ToString ( ) ) ;
18
32
}
19
33
}
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
+ }
20
61
}
0 commit comments