aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs
diff options
context:
space:
mode:
authorLuke Foust <luke@foust.com>2020-03-20 12:53:52 -0700
committerGitHub <noreply@github.com>2020-03-20 12:53:52 -0700
commitdcd0d93f44bf1befea5e61993bc868b5846102a0 (patch)
tree740f132fce52947fc8a73621588ca36c3447922a /MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs
parent80dfc78ba5ec3895fd374a5bd761d0d0e9e6a862 (diff)
parente028fb6fdefa6120fc6109c63d883d21412c31bd (diff)
Merge pull request #1 from jellyfin/master
merge with upstream master
Diffstat (limited to 'MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs')
-rw-r--r--MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs53
1 files changed, 53 insertions, 0 deletions
diff --git a/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs b/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs
new file mode 100644
index 000000000..fe5dd6cd4
--- /dev/null
+++ b/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Buffers;
+using System.Buffers.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace MediaBrowser.Common.Json.Converters
+{
+ /// <summary>
+ /// Converts a GUID object or value to/from JSON.
+ /// </summary>
+ public class JsonInt32Converter : JsonConverter<int>
+ {
+ /// <inheritdoc />
+ public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ static void ThrowFormatException() => throw new FormatException("Invalid format for an integer.");
+ ReadOnlySpan<byte> span = stackalloc byte[0];
+
+ if (reader.HasValueSequence)
+ {
+ long sequenceLength = reader.ValueSequence.Length;
+ Span<byte> stackSpan = stackalloc byte[(int)sequenceLength];
+ reader.ValueSequence.CopyTo(stackSpan);
+ span = stackSpan;
+ }
+ else
+ {
+ span = reader.ValueSpan;
+ }
+
+ if (!Utf8Parser.TryParse(span, out int number, out _))
+ {
+ ThrowFormatException();
+ }
+
+ return number;
+ }
+
+ /// <inheritdoc />
+ public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
+ {
+ static void ThrowInvalidOperationException() => throw new InvalidOperationException();
+ Span<byte> span = stackalloc byte[16];
+ if (Utf8Formatter.TryFormat(value, span, out int bytesWritten))
+ {
+ writer.WriteStringValue(span.Slice(0, bytesWritten));
+ }
+
+ ThrowInvalidOperationException();
+ }
+ }
+}