Skip to content

Commit f86120b

Browse files
authored
refactor!: model MQTT scalar-or-schema values as a type hierarchy (#50)
1 parent 925a9ab commit f86120b

6 files changed

Lines changed: 164 additions & 147 deletions

File tree

‎src/ByteBard.AsyncAPI.Bindings/MQTT/MQTTMessageBinding.cs‎

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,9 @@ public class MQTTMessageBinding : MessageBinding<MQTTMessageBinding>
3030

3131
/// <summary>
3232
/// The topic (channel URI) for a response message.
33+
/// Either an <see cref="MQTTString"/> or an <see cref="MQTTStringSchema"/>.
3334
/// </summary>
34-
public string ResponseTopic
35-
{
36-
get => this.ResponseTopicValue?.Value;
37-
set => this.ResponseTopicValue = value == null ? null : MQTTStringOrSchema.FromString(value);
38-
}
39-
40-
/// <summary>The string-or-schema response topic value.</summary>
41-
public MQTTStringOrSchema ResponseTopicValue { get; set; }
35+
public MQTTStringOrSchema ResponseTopic { get; set; }
4236

4337
/// <summary>
4438
/// Writes the MQTT message binding object and its extensions for AsyncAPI 2.0.
@@ -61,7 +55,7 @@ public override void SerializeV3(IAsyncApiWriter writer)
6155
/// <summary>
6256
/// Writes the MQTT message binding object and its extensions for AsyncAPI 3.0.
6357
/// </summary>
64-
/// <remarks>ResponseTopicValue is written as a string or schema; nested schemas use AsyncAPI 3.0 serialization.</remarks>
58+
/// <remarks>ResponseTopic is written as a string or schema; nested schemas use AsyncAPI 3.0 serialization.</remarks>
6559
/// <exception cref="ArgumentNullException"><paramref name="writer"/> is null.</exception>
6660
public override void SerializeProperties(IAsyncApiWriter writer)
6761
{
@@ -85,8 +79,12 @@ private void SerializeProperties(IAsyncApiWriter writer, AsyncApiVersion version
8579
writer.WriteOptionalProperty("payloadFormatIndicator", this.PayloadFormatIndicator);
8680
writer.WriteOptionalObject("correlationData", this.CorrelationData, (w, h) => { if (version == AsyncApiVersion.AsyncApi2_0) h.SerializeV2(w); else h.SerializeV3(w); });
8781
writer.WriteOptionalProperty("contentType", this.ContentType);
88-
if (this.ResponseTopicValue?.Value != null) writer.WriteOptionalProperty("responseTopic", this.ResponseTopicValue.Value);
89-
else if (this.ResponseTopicValue?.Schema != null) writer.WriteOptionalObject("responseTopic", this.ResponseTopicValue.Schema, (w, schema) => { if (version == AsyncApiVersion.AsyncApi2_0) schema.SerializeV2(w); else schema.SerializeV3(w); });
82+
if (this.ResponseTopic != null)
83+
{
84+
writer.WritePropertyName("responseTopic");
85+
this.ResponseTopic.Serialize(writer, version);
86+
}
87+
9088
writer.WriteOptionalProperty("bindingVersion", this.BindingVersion);
9189
writer.WriteExtensions(this.Extensions);
9290
writer.WriteEndObject();
@@ -100,7 +98,7 @@ private void SerializeProperties(IAsyncApiWriter writer, AsyncApiVersion version
10098
{ "payloadFormatIndicator", (a, n) => { a.PayloadFormatIndicator = n.GetIntegerValue(); } },
10199
{ "correlationData", (a, n) => { a.CorrelationData = AsyncApiJsonSchemaDeserializer.LoadSchema(n); } },
102100
{ "contentType", (a, n) => { a.ContentType = n.GetScalarValue(); } },
103-
{ "responseTopic", (a, n) => { a.ResponseTopicValue = MQTTStringOrSchema.Parse(n); } },
101+
{ "responseTopic", (a, n) => { a.ResponseTopic = MQTTStringOrSchema.Parse(n); } },
104102
};
105103
}
106104
}

‎src/ByteBard.AsyncAPI.Bindings/MQTT/MQTTOperationBinding.cs‎

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,9 @@ public bool Retain
3434

3535
/// <summary>
3636
/// Interval in seconds or a Schema Object containing the definition of the lifetime of the message.
37+
/// Either an <see cref="MQTTInteger"/> or an <see cref="MQTTIntegerSchema"/>.
3738
/// </summary>
38-
public int? MessageExpiryInterval
39-
{
40-
get => this.MessageExpiryIntervalValue?.Integer;
41-
set => this.MessageExpiryIntervalValue = value.HasValue ? MQTTIntegerOrSchema.FromInteger(value.Value) : null;
42-
}
43-
44-
/// <summary>The integer-or-schema message expiry interval value.</summary>
45-
public MQTTIntegerOrSchema MessageExpiryIntervalValue { get; set; }
39+
public MQTTIntegerOrSchema MessageExpiryInterval { get; set; }
4640

4741
public override string BindingKey => "mqtt";
4842

@@ -51,7 +45,7 @@ public int? MessageExpiryInterval
5145
{ "bindingVersion", (a, n) => { a.BindingVersion = n.GetScalarValue(); } },
5246
{ "qos", (a, n) => { a.QoS = n.GetIntegerValue(); } },
5347
{ "retain", (a, n) => { a.Retain = n.GetBooleanValue(); } },
54-
{ "messageExpiryInterval", (a, n) => { a.MessageExpiryIntervalValue = MQTTIntegerOrSchema.Parse(n); } },
48+
{ "messageExpiryInterval", (a, n) => { a.MessageExpiryInterval = MQTTIntegerOrSchema.Parse(n); } },
5549
};
5650

5751
/// <summary>
@@ -98,12 +92,12 @@ private void SerializeProperties(IAsyncApiWriter writer, AsyncApiVersion version
9892
writer.WriteStartObject();
9993
writer.WriteOptionalProperty("qos", this.qos);
10094
writer.WriteOptionalProperty("retain", this.retain);
101-
if (this.MessageExpiryIntervalValue?.LongInteger is long integer) writer.WriteRequiredProperty("messageExpiryInterval", integer);
102-
else if (this.MessageExpiryIntervalValue?.Schema != null) writer.WriteOptionalObject("messageExpiryInterval", this.MessageExpiryIntervalValue.Schema, (w, schema) =>
95+
if (this.MessageExpiryInterval != null)
10396
{
104-
if (version == AsyncApiVersion.AsyncApi2_0) schema.SerializeV2(w);
105-
else schema.SerializeV3(w);
106-
});
97+
writer.WritePropertyName("messageExpiryInterval");
98+
this.MessageExpiryInterval.Serialize(writer, version);
99+
}
100+
107101
writer.WriteOptionalProperty("bindingVersion", this.BindingVersion);
108102
writer.WriteExtensions(this.Extensions);
109103
writer.WriteEndObject();

‎src/ByteBard.AsyncAPI.Bindings/MQTT/MQTTServerBinding.cs‎

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,16 @@ public class MQTTServerBinding : ServerBinding<MQTTServerBinding>
3636
/// <summary>
3737
/// Interval in seconds the broker maintains a session
3838
/// for a disconnected client until this interval expires.
39+
/// Either an <see cref="MQTTInteger"/> or an <see cref="MQTTIntegerSchema"/>.
3940
/// </summary>
40-
public int? SessionExpiryInterval
41-
{
42-
get => this.SessionExpiryIntervalValue?.Integer;
43-
set => this.SessionExpiryIntervalValue = value.HasValue ? MQTTIntegerOrSchema.FromInteger(value.Value) : null;
44-
}
45-
46-
/// <summary>The integer-or-schema session expiry interval value.</summary>
47-
public MQTTIntegerOrSchema SessionExpiryIntervalValue { get; set; }
41+
public MQTTIntegerOrSchema SessionExpiryInterval { get; set; }
4842

4943
/// <summary>
5044
/// Number of bytes representing the maximum packet size
5145
/// the client is willing to accept.
46+
/// Either an <see cref="MQTTInteger"/> or an <see cref="MQTTIntegerSchema"/>.
5247
/// </summary>
53-
public int? MaximumPacketSize
54-
{
55-
get => this.MaximumPacketSizeValue?.Integer;
56-
set => this.MaximumPacketSizeValue = value.HasValue ? MQTTIntegerOrSchema.FromInteger(value.Value) : null;
57-
}
58-
59-
/// <summary>The integer-or-schema maximum packet size value.</summary>
60-
public MQTTIntegerOrSchema MaximumPacketSizeValue { get; set; }
48+
public MQTTIntegerOrSchema MaximumPacketSize { get; set; }
6149

6250
public override string BindingKey => "mqtt";
6351

@@ -68,8 +56,8 @@ public int? MaximumPacketSize
6856
{ "cleanSession", (a, n) => { a.CleanSession = n.GetBooleanValue(); } },
6957
{ "lastWill", (a, n) => { a.LastWill = n.ParseMap(LastWillFixedFields); } },
7058
{ "keepAlive", (a, n) => { a.KeepAlive = n.GetIntegerValue(); } },
71-
{ "sessionExpiryInterval", (a, n) => { a.SessionExpiryIntervalValue = MQTTIntegerOrSchema.Parse(n); } },
72-
{ "maximumPacketSize", (a, n) => { a.MaximumPacketSizeValue = MQTTIntegerOrSchema.Parse(n); } },
59+
{ "sessionExpiryInterval", (a, n) => { a.SessionExpiryInterval = MQTTIntegerOrSchema.Parse(n); } },
60+
{ "maximumPacketSize", (a, n) => { a.MaximumPacketSize = MQTTIntegerOrSchema.Parse(n); } },
7361
};
7462

7563
private static FixedFieldMap<LastWill> LastWillFixedFields = new()
@@ -126,8 +114,8 @@ private void SerializeProperties(IAsyncApiWriter writer, AsyncApiVersion version
126114
writer.WriteOptionalProperty("cleanSession", this.CleanSession);
127115
writer.WriteOptionalObject("lastWill", this.LastWill, (w, l) => l.Serialize(w));
128116
writer.WriteOptionalProperty("keepAlive", this.KeepAlive);
129-
this.WriteIntegerOrSchema(writer, "sessionExpiryInterval", this.SessionExpiryIntervalValue, version);
130-
this.WriteIntegerOrSchema(writer, "maximumPacketSize", this.MaximumPacketSizeValue, version);
117+
this.WriteIntegerOrSchema(writer, "sessionExpiryInterval", this.SessionExpiryInterval, version);
118+
this.WriteIntegerOrSchema(writer, "maximumPacketSize", this.MaximumPacketSize, version);
131119
writer.WriteOptionalProperty(AsyncApiConstants.BindingVersion, this.BindingVersion);
132120
writer.WriteExtensions(this.Extensions);
133121
writer.WriteEndObject();
@@ -143,12 +131,13 @@ private void SerializeProperties(IAsyncApiWriter writer, AsyncApiVersion version
143131
/// <exception cref="ArgumentNullException">A value is present and <paramref name="writer"/> or <paramref name="name"/> is null.</exception>
144132
private void WriteIntegerOrSchema(IAsyncApiWriter writer, string name, MQTTIntegerOrSchema value, AsyncApiVersion version)
145133
{
146-
if (value?.LongInteger is long integer) writer.WriteRequiredProperty(name, integer);
147-
else if (value?.Schema != null) writer.WriteOptionalObject(name, value.Schema, (w, schema) =>
134+
if (value == null)
148135
{
149-
if (version == AsyncApiVersion.AsyncApi2_0) schema.SerializeV2(w);
150-
else schema.SerializeV3(w);
151-
});
136+
return;
137+
}
138+
139+
writer.WritePropertyName(name);
140+
value.Serialize(writer, version);
152141
}
153142
}
154143
}

0 commit comments

Comments
 (0)