diff options
| author | Bond_009 <bond.009@outlook.com> | 2020-01-09 18:26:22 +0100 |
|---|---|---|
| committer | Bond_009 <bond.009@outlook.com> | 2020-01-09 18:26:22 +0100 |
| commit | b50c4938e19eaa4508dd9192bc63c3788c2fa3eb (patch) | |
| tree | e8a29d7c1ecc22b20287a940d757d635b5208b00 /MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs | |
| parent | a1ca50fd5a74eafa6e609976d90cad42b54137e5 (diff) | |
| parent | 162c1ac7b7fde0e4929cf262b0f275e3eb15524c (diff) | |
Merge branch 'master' into namingtests
Diffstat (limited to 'MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs')
| -rw-r--r-- | MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs | 53 |
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(); + } + } +} |
