-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathAsyncApiMessage.cs
More file actions
146 lines (120 loc) · 6.22 KB
/
AsyncApiMessage.cs
File metadata and controls
146 lines (120 loc) · 6.22 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright (c) The LEGO Group. All rights reserved.
namespace LEGO.AsyncAPI.Models
{
using System;
using System.Collections.Generic;
using LEGO.AsyncAPI.Models.Interfaces;
using LEGO.AsyncAPI.Writers;
/// <summary>
/// Describes a message received on a given channel and operation.
/// </summary>
public class AsyncApiMessage : IAsyncApiExtensible, IAsyncApiReferenceable, IAsyncApiSerializable
{
/// <summary>
/// Unique string used to identify the message. The id MUST be unique among all messages described in the API.
/// </summary>
public string MessageId { get; set; }
/// <summary>
/// schema definition of the application headers. Schema MUST be of type "object".
/// </summary>
public AsyncApiJsonSchema Headers { get; set; }
/// <summary>
/// definition of the message payload. It can be of any type but defaults to Schema object. It must match the schema format, including encoding type - e.g Avro should be inlined as either a YAML or JSON object NOT a string to be parsed as YAML or JSON.
/// </summary>
public IAsyncApiMessagePayload Payload { get; set; }
/// <summary>
/// definition of the correlation ID used for message tracing or matching.
/// </summary>
public AsyncApiCorrelationId CorrelationId { get; set; }
/// <summary>
/// a string containing the name of the schema format used to define the message payload.
/// </summary>
/// <remarks>
/// If omitted, implementations should parse the payload as a Schema object.
/// </remarks>
public string SchemaFormat { get; set; }
/// <summary>
/// the content type to use when encoding/decoding a message's payload.
/// </summary>
public string ContentType { get; set; }
/// <summary>
/// a machine-friendly name for the message.
/// </summary>
public string Name { get; set; }
/// <summary>
/// a human-friendly title for the message.
/// </summary>
public string Title { get; set; }
/// <summary>
/// a short summary of what the message is about.
/// </summary>
public string Summary { get; set; }
/// <summary>
/// a verbose explanation of the message. CommonMark syntax can be used for rich text representation.
/// </summary>
public string Description { get; set; }
/// <summary>
/// a list of tags for API documentation control. Tags can be used for logical grouping of messages.
/// </summary>
public IList<AsyncApiTag> Tags { get; set; } = new List<AsyncApiTag>();
/// <summary>
/// additional external documentation for this message.
/// </summary>
public AsyncApiExternalDocumentation ExternalDocs { get; set; }
/// <summary>
/// a map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the message.
/// </summary>
public AsyncApiBindings<IMessageBinding> Bindings { get; set; } = new AsyncApiBindings<IMessageBinding>();
/// <summary>
/// list of examples.
/// </summary>
public IList<AsyncApiMessageExample> Examples { get; set; } = new List<AsyncApiMessageExample>();
/// <summary>
/// a list of traits to apply to the message object. Traits MUST be merged into the message object using the JSON Merge Patch algorithm in the same order they are defined here. The resulting object MUST be a valid Message Object.
/// </summary>
public IList<AsyncApiMessageTrait> Traits { get; set; } = new List<AsyncApiMessageTrait>();
/// <inheritdoc/>
public IDictionary<string, IAsyncApiExtension> Extensions { get; set; } = new Dictionary<string, IAsyncApiExtension>();
/// <inheritdoc/>
public bool UnresolvedReference { get; set; }
/// <inheritdoc/>
public AsyncApiReference Reference { get; set; }
public void SerializeV2(IAsyncApiWriter writer)
{
if (writer is null)
{
throw new ArgumentNullException(nameof(writer));
}
if (this.Reference != null && !writer.GetSettings().ShouldInlineReference(this.Reference))
{
this.Reference.SerializeV2(writer);
return;
}
this.SerializeV2WithoutReference(writer);
}
public void SerializeV2WithoutReference(IAsyncApiWriter writer)
{
if (writer is null)
{
throw new ArgumentNullException(nameof(writer));
}
writer.WriteStartObject();
writer.WriteOptionalObject(AsyncApiConstants.Headers, this.Headers, (w, h) => h.SerializeV2(w));
writer.WriteOptionalObject(AsyncApiConstants.Payload, this.Payload, (w, p) => p.SerializeV2(w));
writer.WriteOptionalObject(AsyncApiConstants.CorrelationId, this.CorrelationId, (w, c) => c.SerializeV2(w));
writer.WriteOptionalProperty(AsyncApiConstants.SchemaFormat, this.SchemaFormat);
writer.WriteOptionalProperty(AsyncApiConstants.ContentType, this.ContentType);
writer.WriteOptionalProperty(AsyncApiConstants.Name, this.Name);
writer.WriteOptionalProperty(AsyncApiConstants.Title, this.Title);
writer.WriteOptionalProperty(AsyncApiConstants.Summary, this.Summary);
writer.WriteOptionalProperty(AsyncApiConstants.Description, this.Description);
writer.WriteOptionalCollection(AsyncApiConstants.Tags, this.Tags, (w, t) => t.SerializeV2(w));
writer.WriteOptionalObject(AsyncApiConstants.ExternalDocs, this.ExternalDocs, (w, e) => e.SerializeV2(w));
writer.WriteOptionalObject(AsyncApiConstants.Bindings, this.Bindings, (w, t) => t.SerializeV2(w));
writer.WriteOptionalCollection(AsyncApiConstants.Examples, this.Examples, (w, e) => e.SerializeV2(w));
writer.WriteOptionalCollection(AsyncApiConstants.Traits, this.Traits, (w, t) => t.SerializeV2(w));
writer.WriteExtensions(this.Extensions);
writer.WriteEndObject();
}
}
}