Skip to content

Commit b94c307

Browse files
authored
Merge pull request #261 from Microsoft/dm/fix-schema-v2
Fix header deserialization in V2 documents
2 parents c94ef0f + 27a2ad8 commit b94c307

File tree

4 files changed

+131
-17
lines changed

4 files changed

+131
-17
lines changed

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

Lines changed: 101 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
5+
using Microsoft.OpenApi.Any;
46
using Microsoft.OpenApi.Extensions;
57
using Microsoft.OpenApi.Models;
8+
using Microsoft.OpenApi.Readers.Exceptions;
69
using Microsoft.OpenApi.Readers.ParseNodes;
710

811
namespace Microsoft.OpenApi.Readers.V2
@@ -22,41 +25,107 @@ internal static partial class OpenApiV2Deserializer
2225
}
2326
},
2427
{
25-
"required", (o, n) =>
28+
"type", (o, n) =>
2629
{
27-
o.Required = bool.Parse(n.GetScalarValue());
30+
GetOrCreateSchema(o).Type = n.GetScalarValue();
2831
}
2932
},
3033
{
31-
"deprecated", (o, n) =>
34+
"format", (o, n) =>
3235
{
33-
o.Deprecated = bool.Parse(n.GetScalarValue());
36+
GetOrCreateSchema(o).Format = n.GetScalarValue();
3437
}
3538
},
3639
{
37-
"allowReserved", (o, n) =>
40+
"items", (o, n) =>
3841
{
39-
o.AllowReserved = bool.Parse(n.GetScalarValue());
42+
GetOrCreateSchema(o).Items = LoadSchema(n);
4043
}
4144
},
4245
{
43-
"style", (o, n) =>
46+
"collectionFormat", (o, n) =>
4447
{
45-
o.Style = n.GetScalarValue().GetEnumFromDisplayName<ParameterStyle>();
48+
LoadStyle(o, n.GetScalarValue());
4649
}
4750
},
4851
{
49-
"type", (o, n) =>
52+
"default", (o, n) =>
5053
{
51-
GetOrCreateSchema(o).Type = n.GetScalarValue();
54+
GetOrCreateSchema(o).Default = n.CreateAny();
55+
}
56+
},
57+
{
58+
"maximum", (o, n) =>
59+
{
60+
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue());
5261
}
5362
},
5463
{
55-
"format", (o, n) =>
64+
"exclusiveMaximum", (o, n) =>
5665
{
57-
GetOrCreateSchema(o).Format = n.GetScalarValue();
66+
GetOrCreateSchema(o).ExclusiveMaximum = bool.Parse(n.GetScalarValue());
67+
}
68+
},
69+
{
70+
"minimum", (o, n) =>
71+
{
72+
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue());
73+
}
74+
},
75+
{
76+
"exclusiveMinimum", (o, n) =>
77+
{
78+
GetOrCreateSchema(o).ExclusiveMinimum = bool.Parse(n.GetScalarValue());
79+
}
80+
},
81+
{
82+
"maxLength", (o, n) =>
83+
{
84+
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue());
85+
}
86+
},
87+
{
88+
"minLength", (o, n) =>
89+
{
90+
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue());
91+
}
92+
},
93+
{
94+
"pattern", (o, n) =>
95+
{
96+
GetOrCreateSchema(o).Pattern = n.GetScalarValue();
97+
}
98+
},
99+
{
100+
"maxItems", (o, n) =>
101+
{
102+
GetOrCreateSchema(o).MaxItems = int.Parse(n.GetScalarValue());
103+
}
104+
},
105+
{
106+
"minItems", (o, n) =>
107+
{
108+
GetOrCreateSchema(o).MinItems = int.Parse(n.GetScalarValue());
109+
}
110+
},
111+
{
112+
"uniqueItems", (o, n) =>
113+
{
114+
GetOrCreateSchema(o).UniqueItems = bool.Parse(n.GetScalarValue());
58115
}
59116
},
117+
{
118+
"multipleOf", (o, n) =>
119+
{
120+
GetOrCreateSchema(o).MultipleOf = decimal.Parse(n.GetScalarValue());
121+
}
122+
},
123+
{
124+
"enum", (o, n) =>
125+
{
126+
GetOrCreateSchema(o).Enum = n.CreateListOfAny();
127+
}
128+
}
60129
};
61130

62131
private static readonly PatternFieldMap<OpenApiHeader> _headerPatternFields = new PatternFieldMap<OpenApiHeader>
@@ -82,5 +151,25 @@ public static OpenApiHeader LoadHeader(ParseNode node)
82151

83152
return header;
84153
}
154+
155+
private static void LoadStyle(OpenApiHeader header, string style)
156+
{
157+
switch (style)
158+
{
159+
case "csv":
160+
header.Style = ParameterStyle.Simple;
161+
return;
162+
case "ssv":
163+
header.Style = ParameterStyle.SpaceDelimited;
164+
return;
165+
case "pipes":
166+
header.Style = ParameterStyle.PipeDelimited;
167+
return;
168+
case "tsv":
169+
throw new NotSupportedException();
170+
default:
171+
throw new OpenApiReaderException("Unrecognized header style: " + style);
172+
}
173+
}
85174
}
86175
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ internal static partial class OpenApiV2Deserializer
120120
{
121121
"default", (o, n) =>
122122
{
123-
GetOrCreateSchema(o).Default = new OpenApiString(n.GetScalarValue());
123+
GetOrCreateSchema(o).Default = n.CreateAny();
124124
}
125125
},
126126
{
@@ -132,8 +132,7 @@ internal static partial class OpenApiV2Deserializer
132132
{
133133
"enum", (o, n) =>
134134
{
135-
GetOrCreateSchema(o).Enum =
136-
n.CreateSimpleList<IOpenApiAny>(l => new OpenApiString(l.GetScalarValue()));
135+
GetOrCreateSchema(o).Enum = n.CreateListOfAny();
137136
}
138137
},
139138
{

test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System.Collections.Generic;
45
using System.IO;
56
using FluentAssertions;
7+
using Microsoft.OpenApi.Any;
68
using Microsoft.OpenApi.Models;
79
using Microsoft.OpenApi.Readers.ParseNodes;
810
using Microsoft.OpenApi.Readers.V2;
@@ -137,13 +139,31 @@ public void ParseHeaderParameterShouldSucceed()
137139
Description = "token to be passed as a header",
138140
Required = true,
139141
Style = ParameterStyle.Simple,
142+
140143
Schema = new OpenApiSchema
141144
{
142145
Type = "array",
143146
Items = new OpenApiSchema
144147
{
145148
Type = "integer",
146-
Format = "int64"
149+
Format = "int64",
150+
Enum = new List<IOpenApiAny>
151+
{
152+
new OpenApiInteger(1),
153+
new OpenApiInteger(2),
154+
new OpenApiInteger(3),
155+
new OpenApiInteger(4),
156+
}
157+
},
158+
Default = new OpenApiArray() {
159+
new OpenApiInteger(1),
160+
new OpenApiInteger(2)
161+
},
162+
Enum = new List<IOpenApiAny>
163+
{
164+
new OpenApiArray() { new OpenApiInteger(1), new OpenApiInteger(2) },
165+
new OpenApiArray() { new OpenApiInteger(2), new OpenApiInteger(3) },
166+
new OpenApiArray() { new OpenApiInteger(3), new OpenApiInteger(4) }
147167
}
148168
}
149169
});

test/Microsoft.OpenApi.Readers.Tests/V2Tests/Samples/OpenApiParameter/headerParameter.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ in: header
44
description: token to be passed as a header
55
required: true
66
type: array
7+
default: [1,2]
78
items:
89
type: integer
910
format: int64
10-
collectionFormat: csv
11+
enum: [1,2,3,4]
12+
collectionFormat: csv
13+
enum:
14+
- [1,2]
15+
- [2,3]
16+
- [3,4]

0 commit comments

Comments
 (0)