Skip to content

Commit 03337b9

Browse files
committed
- add handling for V3
- add handling for compelx type
1 parent d2fb8ba commit 03337b9

File tree

7 files changed

+75
-14
lines changed

7 files changed

+75
-14
lines changed

src/Microsoft.OpenApi.Readers/ParseNodes/IOpenApiAnyExtensions.cs

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,29 @@ internal static class OpenApiStringConverter
1010
{
1111
public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny)
1212
{
13+
if (openApiAny is OpenApiArray openApiArray)
14+
{
15+
var newArray = new OpenApiArray();
16+
foreach (var element in openApiArray)
17+
{
18+
newArray.Add(GetSpecificOpenApiAny(element));
19+
}
20+
21+
return newArray;
22+
}
23+
24+
if (openApiAny is OpenApiObject openApiObject)
25+
{
26+
var newObject = new OpenApiObject();
27+
28+
foreach (var key in openApiObject.Keys.ToList())
29+
{
30+
newObject[key] = GetSpecificOpenApiAny(openApiObject[key]);
31+
}
32+
33+
return newObject;
34+
}
35+
1336
if ( !(openApiAny is OpenApiString))
1437
{
1538
return openApiAny;
@@ -58,15 +81,12 @@ public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny)
5881

5982
public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny, OpenApiSchema schema)
6083
{
61-
var type = schema.Type;
62-
var format = schema.Format;
63-
6484
if (openApiAny is OpenApiArray openApiArray)
6585
{
6686
var newArray = new OpenApiArray();
6787
foreach (var element in openApiArray)
6888
{
69-
newArray.Add(GetSpecificOpenApiAny(element, schema.Items));
89+
newArray.Add(GetSpecificOpenApiAny(element, schema?.Items));
7090
}
7191

7292
return newArray;
@@ -78,7 +98,14 @@ public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny, OpenApiS
7898

7999
foreach (var key in openApiObject.Keys.ToList())
80100
{
81-
newObject[key] = GetSpecificOpenApiAny(openApiObject[key], schema.AdditionalProperties);
101+
if ( schema != null && schema.Properties != null && schema.Properties.ContainsKey(key) )
102+
{
103+
newObject[key] = GetSpecificOpenApiAny(openApiObject[key], schema.Properties[key]);
104+
}
105+
else
106+
{
107+
newObject[key] = GetSpecificOpenApiAny(openApiObject[key], schema?.AdditionalProperties);
108+
}
82109
}
83110

84111
return newObject;
@@ -89,11 +116,14 @@ public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny, OpenApiS
89116
return openApiAny;
90117
}
91118

92-
if (type == null && format == null)
119+
if (schema?.Type == null)
93120
{
94-
GetSpecificOpenApiAny(openApiAny);
121+
return GetSpecificOpenApiAny(openApiAny);
95122
}
96123

124+
var type = schema.Type;
125+
var format = schema.Format;
126+
97127
var value = ((OpenApiString)openApiAny).Value;
98128

99129
if (value == null || value == "null")

src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,31 @@ internal static partial class OpenApiV2Deserializer
134134
{s => s.StartsWith("x-"), (o, p, n) => o.AddExtension(p, LoadExtension(p, n))}
135135
};
136136

137+
private static readonly AnyFieldMap<OpenApiHeader> _headerAnyFields =
138+
new AnyFieldMap<OpenApiHeader>
139+
{
140+
{
141+
"default",
142+
new AnyFieldMapParameter<OpenApiHeader>(
143+
p => p.Schema.Default,
144+
(p, v) => p.Schema.Default = v,
145+
p => p.Schema)
146+
}
147+
};
148+
149+
private static readonly AnyListFieldMap<OpenApiHeader> _headerAnyListFields =
150+
new AnyListFieldMap<OpenApiHeader>
151+
{
152+
{
153+
"enum",
154+
new AnyListFieldMapParameter<OpenApiHeader>(
155+
p => p.Schema.Enum,
156+
(p, v) => p.Schema.Enum = v,
157+
p => p.Schema)
158+
},
159+
};
160+
161+
137162
public static OpenApiHeader LoadHeader(ParseNode node)
138163
{
139164
var mapNode = node.CheckMapNode("header");
@@ -150,6 +175,9 @@ public static OpenApiHeader LoadHeader(ParseNode node)
150175
node.Context.SetTempStorage("schema", null);
151176
}
152177

178+
ProcessAnyFields(mapNode, header, _headerAnyFields);
179+
ProcessAnyListFields(mapNode, header, _headerAnyListFields);
180+
153181
return header;
154182
}
155183

src/Microsoft.OpenApi.Readers/V2/OpenApiResponseDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private static void LoadExamples(OpenApiResponse response, ParseNode node)
8383

8484
private static void LoadExample(OpenApiResponse response, string mediaType, ParseNode node)
8585
{
86-
var exampleNode = node.CreateAny();
86+
var exampleNode = OpenApiStringConverter.GetSpecificOpenApiAny(node.CreateAny());
8787

8888
if (response.Content == null)
8989
{

src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ private static void ProcessAnyListFields<T>(
103103

104104
public static IOpenApiAny LoadAny(ParseNode node)
105105
{
106-
return node.CreateAny();
106+
return OpenApiStringConverter.GetSpecificOpenApiAny(node.CreateAny());
107107
}
108108

109109
private static IOpenApiExtension LoadExtension(string name, ParseNode node)

src/Microsoft.OpenApi.Readers/V3/OpenApiSchemaDeserializer.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ public static OpenApiSchema LoadSchema(ParseNode node)
276276
propertyNode.ParseField(domainObject, _schemaFixedFields, _schemaPatternFields);
277277
}
278278

279+
ProcessAnyFields(mapNode, domainObject, _schemaAnyFields);
280+
ProcessAnyListFields(mapNode, domainObject, _schemaAnyListFields);
281+
279282
return domainObject;
280283
}
281284
}

src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ private static RuntimeExpressionAnyWrapper LoadRuntimeExpressionAnyWrapper(Parse
126126

127127
public static IOpenApiAny LoadAny(ParseNode node)
128128
{
129-
return node.CreateAny();
129+
return OpenApiStringConverter.GetSpecificOpenApiAny(node.CreateAny());
130130
}
131131

132132
private static IOpenApiExtension LoadExtension(string name, ParseNode node)

test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void ParsePrimitiveStringSchemaFragmentShouldSucceed()
9494
{
9595
Type = "integer",
9696
Format = "int64",
97-
Default = new OpenApiInteger(88)
97+
Default = new OpenApiLong(88)
9898
});
9999
}
100100

@@ -120,8 +120,8 @@ public void ParseExampleStringFragmentShouldSucceed()
120120
{
121121
["foo"] = new OpenApiString("bar"),
122122
["baz"] = new OpenApiArray() {
123-
new OpenApiInteger(1),
124-
new OpenApiInteger(2)
123+
new OpenApiInteger(1),
124+
new OpenApiInteger(2)
125125
}
126126
});
127127
}
@@ -314,7 +314,7 @@ public void ParseBasicSchemaWithExampleShouldSucceed()
314314
Example = new OpenApiObject
315315
{
316316
["name"] = new OpenApiString("Puma"),
317-
["id"] = new OpenApiInteger(1)
317+
["id"] = new OpenApiLong(1)
318318
}
319319
});
320320
}

0 commit comments

Comments
 (0)