microsoft/teams.net

Public

mirrored from https://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
docs/update-release-process

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

Libraries/Microsoft.Teams.Api/Activities/Activity.JsonConverter.cs

173lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License.
3
4using System.Text.Json;
5using System.Text.Json.Nodes;
6using System.Text.Json.Serialization;
7
8using Microsoft.Teams.Common.Json;
9
10namespace Microsoft.Teams.Api.Activities;
11
12public partial interface IActivity
13{
14 public class JsonConverter : JsonConverter<IActivity>
15 {
16 public override bool CanConvert(Type typeToConvert)
17 {
18 return base.CanConvert(typeToConvert);
19 }
20
21 public override IActivity? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
22 {
23 return JsonSerializer.Deserialize<Activity>(ref reader, options);
24 }
25
26 public override void Write(Utf8JsonWriter writer, IActivity value, JsonSerializerOptions options)
27 {
28 // default to the underlying class type to avoid recursive serialization
29 JsonSerializer.Serialize(writer, value, value.GetType(), options);
30 }
31 }
32}
33
34public partial class Activity
35{
36 public class JsonConverter : JsonConverter<Activity>
37 {
38 public override bool CanConvert(Type typeToConvert)
39 {
40 return base.CanConvert(typeToConvert);
41 }
42
43 public override Activity? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
44 {
45 var element = JsonSerializer.Deserialize<JsonObject>(ref reader, options) ?? throw new Exception("expected json object");
46
47 if (!element.TryGetPropertyValue("type", out var typeNode))
48 {
49 throw new JsonException("activity must have a 'type' property");
50 }
51
52 var type = typeNode.Deserialize<string>(options);
53
54 if (type is null)
55 {
56 throw new JsonException("failed to deserialize activity 'type' property");
57 }
58
59 Activity? activity = type switch
60 {
61 "typing" => element.Deserialize<TypingActivity>(options),
62 "message" => element.Deserialize<MessageActivity>(options),
63 "messageUpdate" => element.Deserialize<MessageUpdateActivity>(options),
64 "messageDelete" => element.Deserialize<MessageDeleteActivity>(options),
65 "messageReaction" => element.Deserialize<MessageReactionActivity>(options),
66 "conversationUpdate" => element.Deserialize<ConversationUpdateActivity>(options),
67#pragma warning disable CS0618
68 "endOfConversation" => element.Deserialize<EndOfConversationActivity>(options),
69#pragma warning restore CS0618
70 "installationUpdate" => element.Deserialize<InstallUpdateActivity>(options),
71 "command" => element.Deserialize<CommandActivity>(options),
72 "commandResult" => element.Deserialize<CommandResultActivity>(options),
73 "event" => element.Deserialize<EventActivity>(options),
74 "invoke" => element.Deserialize<InvokeActivity>(options),
75 _ => null
76 };
77
78 if (activity is null)
79 {
80 activity = new(type);
81 activity.Properties = activity.FromJsonObject(element, options);
82 }
83
84 return activity;
85 }
86
87 public override void Write(Utf8JsonWriter writer, Activity value, JsonSerializerOptions options)
88 {
89 if (value is TypingActivity typing)
90 {
91 JsonSerializer.Serialize(writer, typing, options);
92 return;
93 }
94
95 if (value is MessageActivity message)
96 {
97 JsonSerializer.Serialize(writer, message, options);
98 return;
99 }
100
101 if (value is MessageUpdateActivity messageUpdate)
102 {
103 JsonSerializer.Serialize(writer, messageUpdate, options);
104 return;
105 }
106
107 if (value is MessageDeleteActivity messageDelete)
108 {
109 JsonSerializer.Serialize(writer, messageDelete, options);
110 return;
111 }
112
113 if (value is MessageReactionActivity messageReaction)
114 {
115 JsonSerializer.Serialize(writer, messageReaction, options);
116 return;
117 }
118
119 if (value is ConversationUpdateActivity conversationUpdate)
120 {
121 JsonSerializer.Serialize(writer, conversationUpdate, options);
122 return;
123 }
124
125#pragma warning disable CS0618
126 if (value is EndOfConversationActivity endOfConversation)
127 {
128 JsonSerializer.Serialize(writer, endOfConversation, options);
129 return;
130 }
131#pragma warning restore CS0618
132
133 if (value is CommandActivity command)
134 {
135 JsonSerializer.Serialize(writer, command, options);
136 return;
137 }
138
139 if (value is CommandResultActivity commandResult)
140 {
141 JsonSerializer.Serialize(writer, commandResult, options);
142 return;
143 }
144
145 if (value is EventActivity @event)
146 {
147 JsonSerializer.Serialize(writer, @event, options);
148 return;
149 }
150
151 if (value is InvokeActivity invoke)
152 {
153 JsonSerializer.Serialize(writer, invoke, options);
154 return;
155 }
156
157 JsonSerializer.Serialize(writer, value.ToJsonObject(options), options);
158 }
159 }
160}
161
162public class ActivityJsonConverter : JsonConverterFactory
163{
164 public override bool CanConvert(Type type)
165 {
166 return typeof(IActivity).IsAssignableFrom(type);
167 }
168
169 public override JsonConverter? CreateConverter(Type type, JsonSerializerOptions options)
170 {
171 return type == typeof(Activity) ? new Activity.JsonConverter() : new IActivity.JsonConverter();
172 }
173}