11// Copyright (c) Microsoft Corporation. All rights reserved.
22// Licensed under the MIT license.
33
4+ using System ;
45using System . Collections . Generic ;
56using Microsoft . OpenApi . Extensions ;
67using Microsoft . OpenApi . Models ;
@@ -28,6 +29,10 @@ internal static partial class OpenApiV2Deserializer
2829 "examples" ,
2930 LoadExamples
3031 } ,
32+ {
33+ "x-examples" ,
34+ LoadResponseExamplesExtension
35+ } ,
3136 {
3237 "schema" ,
3338 ( o , n ) => n . Context . SetTempStorage ( TempStorageKeys . ResponseSchema , LoadSchema ( n ) , o )
@@ -37,7 +42,8 @@ internal static partial class OpenApiV2Deserializer
3742 private static readonly PatternFieldMap < OpenApiResponse > _responsePatternFields =
3843 new ( )
3944 {
40- { s => s . StartsWith ( "x-" ) , ( o , p , n ) => o . AddExtension ( p , LoadExtension ( p , n ) ) }
45+ { s => s . StartsWith ( "x-" ) && ! s . Equals ( OpenApiConstants . ExamplesExtension , StringComparison . OrdinalIgnoreCase ) ,
46+ ( o , p , n ) => o . AddExtension ( p , LoadExtension ( p , n ) ) }
4147 } ;
4248
4349 private static readonly AnyFieldMap < OpenApiMediaType > _mediaTypeAnyFields =
@@ -69,6 +75,8 @@ private static void ProcessProduces(MapNode mapNode, OpenApiResponse response, P
6975 ?? context . DefaultContentType ?? new List < string > { "application/octet-stream" } ;
7076
7177 var schema = context . GetFromTempStorage < OpenApiSchema > ( TempStorageKeys . ResponseSchema , response ) ;
78+ var examples = context . GetFromTempStorage < Dictionary < string , OpenApiExample > > ( TempStorageKeys . Examples , response )
79+ ?? new Dictionary < string , OpenApiExample > ( ) ;
7280
7381 foreach ( var produce in produces )
7482 {
@@ -84,20 +92,64 @@ private static void ProcessProduces(MapNode mapNode, OpenApiResponse response, P
8492 {
8593 var mediaType = new OpenApiMediaType
8694 {
87- Schema = schema
95+ Schema = schema ,
96+ Examples = examples
8897 } ;
8998
9099 response . Content . Add ( produce , mediaType ) ;
91100 }
92101 }
93102
94103 context . SetTempStorage ( TempStorageKeys . ResponseSchema , null , response ) ;
104+ context . SetTempStorage ( TempStorageKeys . Examples , null , response ) ;
95105 context . SetTempStorage ( TempStorageKeys . ResponseProducesSet , true , response ) ;
96106 }
97107
108+ private static void LoadResponseExamplesExtension ( OpenApiResponse response , ParseNode node )
109+ {
110+ var examples = LoadExamplesExtension ( node ) ;
111+ node . Context . SetTempStorage ( TempStorageKeys . Examples , examples , response ) ;
112+ }
113+
114+ private static Dictionary < string , OpenApiExample > LoadExamplesExtension ( ParseNode node )
115+ {
116+ var mapNode = node . CheckMapNode ( OpenApiConstants . ExamplesExtension ) ;
117+ var examples = new Dictionary < string , OpenApiExample > ( ) ;
118+
119+ foreach ( var examplesNode in mapNode )
120+ {
121+ // Load the media type node as an OpenApiExample object
122+ var example = new OpenApiExample ( ) ;
123+ var exampleNode = examplesNode . Value . CheckMapNode ( examplesNode . Name ) ;
124+ foreach ( var valueNode in exampleNode )
125+ {
126+ switch ( valueNode . Name . ToLowerInvariant ( ) )
127+ {
128+ case "summary" :
129+ example . Summary = valueNode . Value . GetScalarValue ( ) ;
130+ break ;
131+ case "description" :
132+ example . Description = valueNode . Value . GetScalarValue ( ) ;
133+ break ;
134+ case "value" :
135+ example . Value = OpenApiAnyConverter . GetSpecificOpenApiAny ( valueNode . Value . CreateAny ( ) ) ;
136+ break ;
137+ case "externalValue" :
138+ example . ExternalValue = valueNode . Value . GetScalarValue ( ) ;
139+ break ;
140+ }
141+ }
142+
143+ examples . Add ( examplesNode . Name , example ) ;
144+ }
145+
146+ return examples ;
147+ }
148+
98149 private static void LoadExamples ( OpenApiResponse response , ParseNode node )
99150 {
100151 var mapNode = node . CheckMapNode ( "examples" ) ;
152+
101153 foreach ( var mediaTypeNode in mapNode )
102154 {
103155 LoadExample ( response , mediaTypeNode . Name , mediaTypeNode . Value ) ;
@@ -108,10 +160,7 @@ private static void LoadExample(OpenApiResponse response, string mediaType, Pars
108160 {
109161 var exampleNode = node . CreateAny ( ) ;
110162
111- if ( response . Content == null )
112- {
113- response . Content = new Dictionary < string , OpenApiMediaType > ( ) ;
114- }
163+ response . Content ??= new Dictionary < string , OpenApiMediaType > ( ) ;
115164
116165 OpenApiMediaType mediaTypeObject ;
117166 if ( response . Content . TryGetValue ( mediaType , out var value ) )
@@ -141,6 +190,7 @@ public static OpenApiResponse LoadResponse(ParseNode node)
141190 }
142191
143192 var response = new OpenApiResponse ( ) ;
193+
144194 foreach ( var property in mapNode )
145195 {
146196 property . ParseField ( response , _responseFixedFields , _responsePatternFields ) ;
0 commit comments