forked from microsoft/kiota-dotnet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTextSerializationWriter.cs
More file actions
126 lines (123 loc) · 6.18 KB
/
Copy pathTextSerializationWriter.cs
File metadata and controls
126 lines (123 loc) · 6.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
using Microsoft.IO;
using Microsoft.Kiota.Abstractions;
using Microsoft.Kiota.Abstractions.Extensions;
using Microsoft.Kiota.Abstractions.Helpers;
using Microsoft.Kiota.Abstractions.Serialization;
#if NET5_0_OR_GREATER
using System.Diagnostics.CodeAnalysis;
#endif
namespace Microsoft.Kiota.Serialization.Text;
/// <summary>
/// The <see cref="ISerializationWriter"/> implementation for text content types.
/// </summary>
public class TextSerializationWriter : ISerializationWriter, IDisposable
{
private static readonly RecyclableMemoryStreamManager _memoryStreamManager = new RecyclableMemoryStreamManager();
private readonly RecyclableMemoryStream _stream = _memoryStreamManager.GetStream();
private readonly StreamWriter _writer;
/// <summary>
/// Initializes a new instance of the <see cref="TextSerializationWriter"/> class.
/// </summary>
public TextSerializationWriter()
{
_writer = new(
_stream,
// Default encoding
encoding: new System.Text.UTF8Encoding(false, true),
// Default buffer size
bufferSize: 1024,
leaveOpen: true);
}
private bool _written;
/// <inheritdoc />
public Action<IParsable>? OnBeforeObjectSerialization { get; set; }
/// <inheritdoc />
public Action<IParsable>? OnAfterObjectSerialization { get; set; }
/// <inheritdoc />
public Action<IParsable, ISerializationWriter>? OnStartObjectSerialization { get; set; }
/// <inheritdoc />
public void Dispose()
{
_writer?.Dispose();
GC.SuppressFinalize(this);
}
/// <inheritdoc />
public Stream GetSerializedContent()
{
_writer.Flush();
_stream.Position = 0;
return _stream;
}
/// <inheritdoc />
public void WriteAdditionalData(IDictionary<string, object> value) => throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
/// <inheritdoc />
public void WriteBoolValue(string? key, bool? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteByteArrayValue(string? key, byte[]? value) => WriteStringValue(key, value?.Length > 0 ? Convert.ToBase64String(value) : string.Empty);
/// <inheritdoc />
public void WriteByteValue(string? key, byte? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteCollectionOfObjectValues<T>(string? key, IEnumerable<T>? values) where T : IParsable => throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
/// <inheritdoc />
public void WriteCollectionOfPrimitiveValues<T>(string? key, IEnumerable<T>? values) => throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
/// <inheritdoc />
public void WriteDateTimeOffsetValue(string? key, DateTimeOffset? value) => WriteStringValue(key, value.HasValue ? value.Value.ToString("o", CultureInfo.InvariantCulture) : null);
/// <inheritdoc />
public void WriteDateValue(string? key, Date? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteDecimalValue(string? key, decimal? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteDoubleValue(string? key, double? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteFloatValue(string? key, float? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteGuidValue(string? key, Guid? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteIntValue(string? key, int? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteLongValue(string? key, long? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteNullValue(string? key) => WriteStringValue(key, "null");
/// <inheritdoc />
public void WriteObjectValue<T>(string? key, T? value, params IParsable?[] additionalValuesToMerge) where T : IParsable => throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
/// <inheritdoc />
[CLSCompliant(false)]
public void WriteSbyteValue(string? key, sbyte? value) => WriteStringValue(key, value?.ToString(CultureInfo.InvariantCulture));
/// <inheritdoc />
public void WriteStringValue(string? key, string? value)
{
if(!string.IsNullOrEmpty(key))
throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
if(!string.IsNullOrEmpty(value))
if(_written)
throw new InvalidOperationException("a value was already written for this serialization writer, text content only supports a single value");
else
{
_writer.Write(value);
_written = true;
}
}
/// <inheritdoc />
public void WriteTimeSpanValue(string? key, TimeSpan? value) => WriteStringValue(key, value.HasValue ? XmlConvert.ToString(value.Value) : null);
/// <inheritdoc />
public void WriteTimeValue(string? key, Time? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
#if NET5_0_OR_GREATER
public void WriteCollectionOfEnumValues<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(string? key, IEnumerable<T?>? values) where T : struct, Enum
#else
public void WriteCollectionOfEnumValues<T>(string? key, IEnumerable<T?>? values) where T : struct, Enum
#endif
=> throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
/// <inheritdoc />
#if NET5_0_OR_GREATER
public void WriteEnumValue<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(string? key, T? value) where T : struct, Enum
#else
public void WriteEnumValue<T>(string? key, T? value) where T : struct, Enum
#endif
=> WriteStringValue(key, value.HasValue ? EnumHelpers.GetEnumStringValue(value.Value) : null);
}