@@ -27,6 +27,12 @@ public class OpenApiPathItem : IOpenApiExtensible, IOpenApiPathItem
2727 /// <inheritdoc/>
2828 public IList < IOpenApiParameter > ? Parameters { get ; set ; }
2929
30+ /// <inheritdoc/>
31+ public OpenApiOperation ? Query { get ; set ; }
32+
33+ /// <inheritdoc/>
34+ public IDictionary < string , OpenApiOperation > ? AdditionalOperations { get ; set ; }
35+
3036 /// <inheritdoc/>
3137 public IDictionary < string , IOpenApiExtension > ? Extensions { get ; set ; }
3238
@@ -57,6 +63,8 @@ internal OpenApiPathItem(IOpenApiPathItem pathItem)
5763 Operations = pathItem . Operations != null ? new Dictionary < HttpMethod , OpenApiOperation > ( pathItem . Operations ) : null ;
5864 Servers = pathItem . Servers != null ? [ .. pathItem . Servers ] : null ;
5965 Parameters = pathItem . Parameters != null ? [ .. pathItem . Parameters ] : null ;
66+ Query = pathItem . Query != null ? new OpenApiOperation ( pathItem . Query ) : null ;
67+ AdditionalOperations = pathItem . AdditionalOperations != null ? new Dictionary < string , OpenApiOperation > ( pathItem . AdditionalOperations ) : null ;
6068 Extensions = pathItem . Extensions != null ? new Dictionary < string , IOpenApiExtension > ( pathItem . Extensions ) : null ;
6169 }
6270
@@ -73,15 +81,15 @@ public virtual void SerializeAsV32(IOpenApiWriter writer)
7381 /// </summary>
7482 public virtual void SerializeAsV31 ( IOpenApiWriter writer )
7583 {
76- SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_1 , ( writer , element ) => element . SerializeAsV31 ( writer ) ) ;
84+ SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_1 , ( writer , element ) => element . SerializeAsV31 ( writer ) , downgradeFrom32 : true ) ;
7785 }
7886
7987 /// <summary>
8088 /// Serialize <see cref="OpenApiPathItem"/> to Open Api v3.0
8189 /// </summary>
8290 public virtual void SerializeAsV3 ( IOpenApiWriter writer )
8391 {
84- SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_0 , ( writer , element ) => element . SerializeAsV3 ( writer ) ) ;
92+ SerializeInternal ( writer , OpenApiSpecVersion . OpenApi3_0 , ( writer , element ) => element . SerializeAsV3 ( writer ) , downgradeFrom32 : true ) ;
8593 }
8694
8795 /// <summary>
@@ -120,14 +128,17 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
120128 OpenApiConstants . ExtensionFieldNamePrefix + OpenApiConstants . Description ,
121129 Description ) ;
122130
131+ // Write Query and AdditionalOperations as extensions when downgrading to v2
132+ WriteV32FieldsAsExtensions ( writer ) ;
133+
123134 // specification extensions
124135 writer . WriteExtensions ( Extensions , OpenApiSpecVersion . OpenApi2_0 ) ;
125136
126137 writer . WriteEndObject ( ) ;
127138 }
128139
129140 internal virtual void SerializeInternal ( IOpenApiWriter writer , OpenApiSpecVersion version ,
130- Action < IOpenApiWriter , IOpenApiSerializable > callback )
141+ Action < IOpenApiWriter , IOpenApiSerializable > callback , bool downgradeFrom32 = false )
131142 {
132143 Utils . CheckArgumentNull ( writer ) ;
133144
@@ -151,6 +162,21 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersio
151162 }
152163 }
153164
165+ // OpenAPI 3.2 specific fields
166+ if ( version == OpenApiSpecVersion . OpenApi3_2 )
167+ {
168+ // query operation
169+ writer . WriteOptionalObject ( OpenApiConstants . Query , Query , callback ) ;
170+
171+ // additional operations
172+ writer . WriteOptionalMap ( OpenApiConstants . AdditionalOperations , AdditionalOperations , callback ) ;
173+ }
174+ else if ( downgradeFrom32 )
175+ {
176+ // When downgrading from 3.2 to 3.1/3.0, serialize as extensions
177+ WriteV32FieldsAsExtensions ( writer ) ;
178+ }
179+
154180 // servers
155181 writer . WriteOptionalCollection ( OpenApiConstants . Servers , Servers , callback ) ;
156182
@@ -163,6 +189,29 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersio
163189 writer . WriteEndObject ( ) ;
164190 }
165191
192+ /// <summary>
193+ /// Writes OpenAPI 3.2 specific fields as extensions when downgrading to older versions
194+ /// </summary>
195+ private void WriteV32FieldsAsExtensions ( IOpenApiWriter writer )
196+ {
197+ if ( Query != null )
198+ {
199+ writer . WritePropertyName ( OpenApiConstants . ExtensionFieldNamePrefix + "oas-" + OpenApiConstants . Query ) ;
200+ Query . SerializeAsV31 ( writer ) ;
201+ }
202+
203+ if ( AdditionalOperations != null && AdditionalOperations . Count > 0 )
204+ {
205+ writer . WritePropertyName ( OpenApiConstants . ExtensionFieldNamePrefix + "oas-" + OpenApiConstants . AdditionalOperations ) ;
206+ writer . WriteStartObject ( ) ;
207+ foreach ( var kvp in AdditionalOperations )
208+ {
209+ writer . WriteOptionalObject ( kvp . Key , kvp . Value , ( w , o ) => o . SerializeAsV31 ( w ) ) ;
210+ }
211+ writer . WriteEndObject ( ) ;
212+ }
213+ }
214+
166215 /// <inheritdoc/>
167216 public IOpenApiPathItem CreateShallowCopy ( )
168217 {
0 commit comments