-
Notifications
You must be signed in to change notification settings - Fork 4
/
TextSerializationWriter.cs
99 lines (97 loc) · 5.02 KB
/
TextSerializationWriter.cs
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
using System;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using Microsoft.Kiota.Abstractions;
using Microsoft.Kiota.Abstractions.Serialization;
using Microsoft.Kiota.Abstractions.Extensions;
using System.Linq;
namespace Microsoft.Kiota.Serialization.Text;
/// <summary>
/// The <see cref="ISerializationWriter"/> implementation for text content types.
/// </summary>
public class TextSerializationWriter : ISerializationWriter, IDisposable {
private readonly MemoryStream _stream = new MemoryStream();
private readonly StreamWriter writer;
/// <summary>
/// Initializes a new instance of the <see cref="TextSerializationWriter"/> class.
/// </summary>
public TextSerializationWriter()
{
writer = new(_stream);
}
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()
{
_stream?.Dispose();
writer?.Dispose();
GC.SuppressFinalize(this);
}
/// <inheritdoc />
public Stream GetSerializedContent() {
writer.Flush();
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?.Any() ?? false ? Convert.ToBase64String(value) : string.Empty);
/// <inheritdoc />
public void WriteByteValue(string? key, byte? value) => WriteStringValue(key, value?.ToString());
/// <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() : 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());
/// <inheritdoc />
public void WriteDoubleValue(string? key, double? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteFloatValue(string? key, float? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteGuidValue(string? key, Guid? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteIntValue(string? key, int? value) => WriteStringValue(key, value?.ToString());
/// <inheritdoc />
public void WriteLongValue(string? key, long? value) => WriteStringValue(key, value?.ToString());
/// <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 />
public void WriteSbyteValue(string? key, sbyte? value) => WriteStringValue(key, value?.ToString());
/// <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 />
void ISerializationWriter.WriteCollectionOfEnumValues<T>(string? key, IEnumerable<T?>? values) => throw new InvalidOperationException(TextParseNode.NoStructuredDataMessage);
/// <inheritdoc />
void ISerializationWriter.WriteEnumValue<T>(string? key, T? value) => WriteStringValue(key, value.HasValue ? value.Value.ToString().ToFirstCharacterLowerCase() : null);
}