Skip to content

Commit 09fb905

Browse files
committed
fix: changes nullability for media type entries
Signed-off-by: Vincent Biret <[email protected]>
1 parent 521d636 commit 09fb905

29 files changed

+187
-95
lines changed

src/Microsoft.OpenApi/Models/Interfaces/IOpenApiHeader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@ public interface IOpenApiHeader : IOpenApiDescribedElement, IOpenApiReadOnlyExte
6060
/// <summary>
6161
/// A map containing the representations for the header.
6262
/// </summary>
63-
public IDictionary<string, OpenApiMediaType>? Content { get; }
63+
public IDictionary<string, OpenApiMediaType?>? Content { get; }
6464

6565
}

src/Microsoft.OpenApi/Models/Interfaces/IOpenApiParameter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,5 @@ public interface IOpenApiParameter : IOpenApiDescribedElement, IOpenApiReadOnlyE
102102
/// When example or examples are provided in conjunction with the schema object,
103103
/// the example MUST follow the prescribed serialization strategy for the parameter.
104104
/// </summary>
105-
public IDictionary<string, OpenApiMediaType>? Content { get; }
105+
public IDictionary<string, OpenApiMediaType?>? Content { get; }
106106
}

src/Microsoft.OpenApi/Models/Interfaces/IOpenApiRequestBody.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public interface IOpenApiRequestBody : IOpenApiDescribedElement, IOpenApiReadOnl
1919
/// REQUIRED. The content of the request body. The key is a media type or media type range and the value describes it.
2020
/// For requests that match multiple keys, only the most specific key is applicable. e.g. text/plain overrides text/*
2121
/// </summary>
22-
public IDictionary<string, OpenApiMediaType>? Content { get; }
22+
public IDictionary<string, OpenApiMediaType?>? Content { get; }
2323
/// <summary>
2424
/// Converts the request body to a body parameter in preparation for a v2 serialization.
2525
/// </summary>

src/Microsoft.OpenApi/Models/Interfaces/IOpenApiResponse.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public interface IOpenApiResponse : IOpenApiDescribedElement, IOpenApiReadOnlyEx
1818
/// A map containing descriptions of potential response payloads.
1919
/// The key is a media type or media type range and the value describes it.
2020
/// </summary>
21-
public IDictionary<string, OpenApiMediaType>? Content { get; }
21+
public IDictionary<string, OpenApiMediaType?>? Content { get; }
2222

2323
/// <summary>
2424
/// A map of operations links that can be followed from the response.

src/Microsoft.OpenApi/Models/OpenApiHeader.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class OpenApiHeader : IOpenApiHeader, IOpenApiExtensible
5050
public IDictionary<string, IOpenApiExample>? Examples { get; set; } = new Dictionary<string, IOpenApiExample>();
5151

5252
/// <inheritdoc/>
53-
public IDictionary<string, OpenApiMediaType>? Content { get; set; } = new Dictionary<string, OpenApiMediaType>();
53+
public IDictionary<string, OpenApiMediaType?>? Content { get; set; } = new Dictionary<string, OpenApiMediaType?>();
5454

5555
/// <inheritdoc/>
5656
public IDictionary<string, IOpenApiExtension>? Extensions { get; set; } = new Dictionary<string, IOpenApiExtension>();
@@ -76,7 +76,7 @@ internal OpenApiHeader(IOpenApiHeader header)
7676
Schema = header.Schema?.CreateShallowCopy();
7777
Example = header.Example != null ? JsonNodeCloneHelper.Clone(header.Example) : null;
7878
Examples = header.Examples != null ? new Dictionary<string, IOpenApiExample>(header.Examples) : null;
79-
Content = header.Content != null ? new Dictionary<string, OpenApiMediaType>(header.Content) : null;
79+
Content = header.Content != null ? new Dictionary<string, OpenApiMediaType?>(header.Content) : null;
8080
Extensions = header.Extensions != null ? new Dictionary<string, IOpenApiExtension>(header.Extensions) : null;
8181
}
8282

@@ -85,19 +85,20 @@ internal OpenApiHeader(IOpenApiHeader header)
8585
/// </summary>
8686
public void SerializeAsV31(IOpenApiWriter writer)
8787
{
88-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV31(writer));
88+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element?.SerializeAsV31(writer));
8989
}
9090

9191
/// <summary>
9292
/// Serialize <see cref="OpenApiHeader"/> to Open Api v3.0
9393
/// </summary>
9494
public void SerializeAsV3(IOpenApiWriter writer)
9595
{
96-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
96+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element?.SerializeAsV3(writer));
9797
}
9898

9999
internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
100-
Action<IOpenApiWriter, IOpenApiSerializable> callback)
100+
Action<IOpenApiWriter, IOpenApiSerializable> callback,
101+
Action<IOpenApiWriter, IOpenApiSerializable?> callbackForOptionals)
101102
{
102103
Utils.CheckArgumentNull(writer);
103104

@@ -134,7 +135,7 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio
134135
writer.WriteOptionalMap(OpenApiConstants.Examples, Examples, callback);
135136

136137
// content
137-
writer.WriteOptionalMap(OpenApiConstants.Content, Content, callback);
138+
writer.WriteOptionalMapOfOptionals(OpenApiConstants.Content, Content, callbackForOptionals);
138139

139140
// extensions
140141
writer.WriteExtensions(Extensions, version);

src/Microsoft.OpenApi/Models/OpenApiParameter.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public bool Explode
6767
public JsonNode? Example { get; set; }
6868

6969
/// <inheritdoc/>
70-
public IDictionary<string, OpenApiMediaType>? Content { get; set; } = new Dictionary<string, OpenApiMediaType>();
70+
public IDictionary<string, OpenApiMediaType?>? Content { get; set; } = new Dictionary<string, OpenApiMediaType?>();
7171

7272
/// <inheritdoc/>
7373
public IDictionary<string, IOpenApiExtension>? Extensions { get; set; } = new Dictionary<string, IOpenApiExtension>();
@@ -93,7 +93,7 @@ internal OpenApiParameter(IOpenApiParameter parameter)
9393
Schema = parameter.Schema?.CreateShallowCopy();
9494
Examples = parameter.Examples != null ? new Dictionary<string, IOpenApiExample>(parameter.Examples) : null;
9595
Example = parameter.Example != null ? JsonNodeCloneHelper.Clone(parameter.Example) : null;
96-
Content = parameter.Content != null ? new Dictionary<string, OpenApiMediaType>(parameter.Content) : null;
96+
Content = parameter.Content != null ? new Dictionary<string, OpenApiMediaType?>(parameter.Content) : null;
9797
Extensions = parameter.Extensions != null ? new Dictionary<string, IOpenApiExtension>(parameter.Extensions) : null;
9898
AllowEmptyValue = parameter.AllowEmptyValue;
9999
Deprecated = parameter.Deprecated;
@@ -102,17 +102,18 @@ internal OpenApiParameter(IOpenApiParameter parameter)
102102
/// <inheritdoc/>
103103
public void SerializeAsV31(IOpenApiWriter writer)
104104
{
105-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
105+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element?.SerializeAsV31(writer));
106106
}
107107

108108
/// <inheritdoc/>
109109
public void SerializeAsV3(IOpenApiWriter writer)
110110
{
111-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
111+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element?.SerializeAsV3(writer));
112112
}
113113

114114
internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
115-
Action<IOpenApiWriter, IOpenApiSerializable> callback)
115+
Action<IOpenApiWriter, IOpenApiSerializable> callback,
116+
Action<IOpenApiWriter, IOpenApiSerializable?> callbackForOptionals)
116117
{
117118
Utils.CheckArgumentNull(writer);
118119

@@ -158,7 +159,7 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio
158159
writer.WriteOptionalMap(OpenApiConstants.Examples, Examples, callback);
159160

160161
// content
161-
writer.WriteOptionalMap(OpenApiConstants.Content, Content, callback);
162+
writer.WriteOptionalMapOfOptionals(OpenApiConstants.Content, Content, callbackForOptionals);
162163

163164
// extensions
164165
writer.WriteExtensions(Extensions, version);

src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class OpenApiRequestBody : IOpenApiReferenceable, IOpenApiExtensible, IOp
2525
public bool Required { get; set; }
2626

2727
/// <inheritdoc />
28-
public IDictionary<string, OpenApiMediaType>? Content { get; set; } = new Dictionary<string, OpenApiMediaType>();
28+
public IDictionary<string, OpenApiMediaType?>? Content { get; set; } = new Dictionary<string, OpenApiMediaType?>();
2929

3030
/// <inheritdoc />
3131
public IDictionary<string, IOpenApiExtension>? Extensions { get; set; } = new Dictionary<string, IOpenApiExtension>();
@@ -43,7 +43,7 @@ internal OpenApiRequestBody(IOpenApiRequestBody requestBody)
4343
Utils.CheckArgumentNull(requestBody);
4444
Description = requestBody.Description ?? Description;
4545
Required = requestBody.Required;
46-
Content = requestBody.Content != null ? new Dictionary<string, OpenApiMediaType>(requestBody.Content) : null;
46+
Content = requestBody.Content != null ? new Dictionary<string, OpenApiMediaType?>(requestBody.Content) : null;
4747
Extensions = requestBody.Extensions != null ? new Dictionary<string, IOpenApiExtension>(requestBody.Extensions) : null;
4848
}
4949

@@ -52,19 +52,19 @@ internal OpenApiRequestBody(IOpenApiRequestBody requestBody)
5252
/// </summary>
5353
public void SerializeAsV31(IOpenApiWriter writer)
5454
{
55-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
55+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element?.SerializeAsV31(writer));
5656
}
5757

5858
/// <summary>
5959
/// Serialize <see cref="OpenApiRequestBody"/> to Open Api v3.0
6060
/// </summary>
6161
public void SerializeAsV3(IOpenApiWriter writer)
6262
{
63-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
63+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element?.SerializeAsV3(writer));
6464
}
6565

6666
internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
67-
Action<IOpenApiWriter, IOpenApiSerializable> callback)
67+
Action<IOpenApiWriter, IOpenApiSerializable?> callbackForOptionals)
6868
{
6969
Utils.CheckArgumentNull(writer);
7070

@@ -74,7 +74,7 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio
7474
writer.WriteProperty(OpenApiConstants.Description, Description);
7575

7676
// content
77-
writer.WriteRequiredMap(OpenApiConstants.Content, Content, callback);
77+
writer.WriteOptionalMapOfOptionals(OpenApiConstants.Content, Content, callbackForOptionals);
7878

7979
// required
8080
writer.WriteProperty(OpenApiConstants.Required, Required, false);
@@ -123,7 +123,7 @@ public IEnumerable<IOpenApiParameter> ConvertToFormDataParameters(IOpenApiWriter
123123
{
124124
if (Content == null || !Content.Any())
125125
yield break;
126-
var properties = Content.First().Value.Schema?.Properties;
126+
var properties = Content.First().Value?.Schema?.Properties;
127127
if(properties != null)
128128
{
129129
foreach (var property in properties)
@@ -154,7 +154,7 @@ public IEnumerable<IOpenApiParameter> ConvertToFormDataParameters(IOpenApiWriter
154154
Name = property.Key,
155155
Schema = paramSchema,
156156
Examples = Content.Values.FirstOrDefault()?.Examples,
157-
Required = Content.First().Value.Schema?.Required?.Contains(property.Key) ?? false
157+
Required = Content.First().Value?.Schema?.Required?.Contains(property.Key) ?? false
158158
};
159159
}
160160
}

src/Microsoft.OpenApi/Models/OpenApiResponse.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class OpenApiResponse : IOpenApiReferenceable, IOpenApiExtensible, IOpenA
2222
public IDictionary<string, IOpenApiHeader>? Headers { get; set; } = new Dictionary<string, IOpenApiHeader>();
2323

2424
/// <inheritdoc/>
25-
public IDictionary<string, OpenApiMediaType>? Content { get; set; } = new Dictionary<string, OpenApiMediaType>();
25+
public IDictionary<string, OpenApiMediaType?>? Content { get; set; } = new Dictionary<string, OpenApiMediaType?>();
2626

2727
/// <inheritdoc/>
2828
public IDictionary<string, IOpenApiLink>? Links { get; set; } = new Dictionary<string, IOpenApiLink>();
@@ -43,7 +43,7 @@ internal OpenApiResponse(IOpenApiResponse response)
4343
Utils.CheckArgumentNull(response);
4444
Description = response.Description ?? Description;
4545
Headers = response.Headers != null ? new Dictionary<string, IOpenApiHeader>(response.Headers) : null;
46-
Content = response.Content != null ? new Dictionary<string, OpenApiMediaType>(response.Content) : null;
46+
Content = response.Content != null ? new Dictionary<string, OpenApiMediaType?>(response.Content) : null;
4747
Links = response.Links != null ? new Dictionary<string, IOpenApiLink>(response.Links) : null;
4848
Extensions = response.Extensions != null ? new Dictionary<string, IOpenApiExtension>(response.Extensions) : null;
4949
}
@@ -53,19 +53,20 @@ internal OpenApiResponse(IOpenApiResponse response)
5353
/// </summary>
5454
public void SerializeAsV31(IOpenApiWriter writer)
5555
{
56-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
56+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element?.SerializeAsV31(writer));
5757
}
5858

5959
/// <summary>
6060
/// Serialize <see cref="OpenApiResponse"/> to Open Api v3.0.
6161
/// </summary>
6262
public void SerializeAsV3(IOpenApiWriter writer)
6363
{
64-
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
64+
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element?.SerializeAsV3(writer));
6565
}
6666

6767
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
68-
Action<IOpenApiWriter, IOpenApiSerializable> callback)
68+
Action<IOpenApiWriter, IOpenApiSerializable> callback,
69+
Action<IOpenApiWriter, IOpenApiSerializable?> callbackForOptionals)
6970
{
7071
Utils.CheckArgumentNull(writer);
7172

@@ -78,7 +79,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
7879
writer.WriteOptionalMap(OpenApiConstants.Headers, Headers, callback);
7980

8081
// content
81-
writer.WriteOptionalMap(OpenApiConstants.Content, Content, callback);
82+
writer.WriteOptionalMapOfOptionals(OpenApiConstants.Content, Content, callbackForOptionals);
8283

8384
// links
8485
writer.WriteOptionalMap(OpenApiConstants.Links, Links, callback);
@@ -112,14 +113,14 @@ public void SerializeAsV2(IOpenApiWriter writer)
112113
writer.WriteOptionalObject(OpenApiConstants.Schema, mediatype.Value.Schema, (w, s) => s.SerializeAsV2(w));
113114

114115
// examples
115-
if (Content.Values.Any(m => m.Example != null))
116+
if (Content.Values.Any(m => m?.Example != null))
116117
{
117118
writer.WritePropertyName(OpenApiConstants.Examples);
118119
writer.WriteStartObject();
119120

120121
foreach (var mediaTypePair in Content)
121122
{
122-
if (mediaTypePair.Value.Example != null)
123+
if (mediaTypePair.Value?.Example != null)
123124
{
124125
writer.WritePropertyName(mediaTypePair.Key);
125126
writer.WriteAny(mediaTypePair.Value.Example);
@@ -129,13 +130,13 @@ public void SerializeAsV2(IOpenApiWriter writer)
129130
writer.WriteEndObject();
130131
}
131132

132-
if (Content.Values.Any(m => m.Examples != null && m.Examples.Any()))
133+
if (Content.Values.Any(m => m?.Examples != null && m.Examples.Any()))
133134
{
134135
writer.WritePropertyName(OpenApiConstants.ExamplesExtension);
135136
writer.WriteStartObject();
136137

137138
foreach (var example in Content
138-
.Select(static x => x.Value.Examples)
139+
.Select(static x => x.Value?.Examples)
139140
.OfType<IDictionary<string, IOpenApiExample>>()
140141
.SelectMany(static x => x))
141142
{

src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public string? Description
7171
public IDictionary<string, IOpenApiExample>? Examples { get => Target?.Examples; }
7272

7373
/// <inheritdoc/>
74-
public IDictionary<string, OpenApiMediaType>? Content { get => Target?.Content; }
74+
public IDictionary<string, OpenApiMediaType?>? Content { get => Target?.Content; }
7575

7676
/// <inheritdoc/>
7777
public IDictionary<string, IOpenApiExtension>? Extensions { get => Target?.Extensions; }

src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public string? Description
7676
public bool Explode { get => Target?.Explode ?? default; }
7777

7878
/// <inheritdoc/>
79-
public IDictionary<string, OpenApiMediaType>? Content { get => Target?.Content; }
79+
public IDictionary<string, OpenApiMediaType?>? Content { get => Target?.Content; }
8080

8181
/// <inheritdoc/>
8282
public IDictionary<string, IOpenApiExtension>? Extensions { get => Target?.Extensions; }

0 commit comments

Comments
 (0)