Skip to content

Commit 43ae516

Browse files
committed
Enhancements to walker
1 parent 0188565 commit 43ae516

File tree

5 files changed

+251
-112
lines changed

5 files changed

+251
-112
lines changed

src/Microsoft.OpenApi/Services/OpenApiValidator.cs

Lines changed: 0 additions & 57 deletions
This file was deleted.

src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ public virtual void Visit(OpenApiResponse response)
125125
{
126126
}
127127

128+
/// <summary>
129+
/// Visits <see cref="OpenApiResponses"/>
130+
/// </summary>
131+
public virtual void Visit(OpenApiResponses response)
132+
{
133+
}
134+
128135
/// <summary>
129136
/// Visits media type content.
130137
/// </summary>
@@ -194,5 +201,19 @@ public virtual void Visit(OpenApiTag tag)
194201
public virtual void Visit(OpenApiOAuthFlow openApiOAuthFlow)
195202
{
196203
}
204+
205+
/// <summary>
206+
/// Visits <see cref="OpenApiOAuthFlow"/>
207+
/// </summary>
208+
public virtual void Visit(IList<OpenApiTag> openApiTags)
209+
{
210+
}
211+
212+
/// <summary>
213+
/// Visits <see cref="IOpenApiExtensible"/>
214+
/// </summary>
215+
public virtual void Visit(IOpenApiExtensible openApiExtensible)
216+
{
217+
}
197218
}
198219
}

src/Microsoft.OpenApi/Services/OpenApiWalker.cs

Lines changed: 108 additions & 53 deletions
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;
45
using System.Collections.Generic;
56
using Microsoft.OpenApi.Models;
7+
using Microsoft.OpenApi.Interfaces;
68

79
namespace Microsoft.OpenApi.Services
810
{
@@ -22,81 +24,134 @@ public OpenApiWalker(OpenApiVisitorBase visitor)
2224
}
2325

2426
/// <summary>
25-
/// Walks through the <see cref="OpenApiDocument"/> and validates each element.
27+
/// Walks through the <see cref="OpenApiDocument"/> and visits each element.
2628
/// </summary>
27-
/// <param name="doc"></param>
29+
/// <param name="doc">OpenApiDocument to be walked</param>
2830
public void Walk(OpenApiDocument doc)
2931
{
3032
_visitor.Visit(doc);
3133
_visitor.Visit(doc.Info);
3234
_visitor.Visit(doc.Servers);
3335

36+
// Visit Servers
3437
if (doc.Servers != null)
3538
{
3639
foreach (var server in doc.Servers)
3740
{
38-
_visitor.Visit(server);
39-
foreach (var variable in server.Variables.Values)
40-
{
41-
_visitor.Visit(variable);
42-
}
41+
WalkServer(server);
4342
}
4443
}
4544

45+
// Visit Paths
4646
_visitor.Visit(doc.Paths);
4747
foreach (var pathItem in doc.Paths.Values)
4848
{
49-
_visitor.Visit(pathItem);
50-
_visitor.Visit(pathItem.Operations);
51-
foreach (var operation in pathItem.Operations.Values)
49+
WalkPathItem(pathItem);
50+
}
51+
52+
_visitor.Visit(doc.Components);
53+
54+
_visitor.Visit(doc.ExternalDocs);
55+
56+
_visitor.Visit(doc.Tags);
57+
58+
foreach (var tag in doc.Tags)
59+
{
60+
WalkTag(tag);
61+
}
62+
63+
_visitor.Visit(doc as IOpenApiExtensible);
64+
65+
}
66+
67+
private void WalkTag(OpenApiTag tag)
68+
{
69+
_visitor.Visit(tag);
70+
_visitor.Visit(tag.ExternalDocs);
71+
_visitor.Visit(tag as IOpenApiExtensible);
72+
}
73+
74+
private void WalkServer(OpenApiServer server)
75+
{
76+
_visitor.Visit(server);
77+
foreach (var variable in server.Variables.Values)
78+
{
79+
_visitor.Visit(variable);
80+
}
81+
_visitor.Visit(server as IOpenApiExtensible);
82+
}
83+
84+
private void WalkPathItem(OpenApiPathItem pathItem)
85+
{
86+
_visitor.Visit(pathItem);
87+
_visitor.Visit(pathItem.Operations);
88+
foreach (var operation in pathItem.Operations.Values)
89+
{
90+
WalkOperation(operation);
91+
}
92+
_visitor.Visit(pathItem as IOpenApiExtensible);
93+
}
94+
95+
private void WalkOperation(OpenApiOperation operation)
96+
{
97+
_visitor.Visit(operation);
98+
if (operation.Parameters != null)
99+
{
100+
_visitor.Visit(operation.Parameters);
101+
foreach (var parameter in operation.Parameters)
52102
{
53-
_visitor.Visit(operation);
54-
if (operation.Parameters != null)
55-
{
56-
_visitor.Visit(operation.Parameters);
57-
foreach (var parameter in operation.Parameters)
58-
{
59-
_visitor.Visit(parameter);
60-
}
61-
}
62-
63-
if (operation.RequestBody != null)
64-
{
65-
_visitor.Visit(operation.RequestBody);
66-
67-
if (operation.RequestBody.Content != null)
68-
{
69-
WalkContent(operation.RequestBody.Content);
70-
}
71-
}
72-
73-
if (operation.Responses != null)
74-
{
75-
_visitor.Visit(operation.Responses);
76-
77-
foreach (var response in operation.Responses.Values)
78-
{
79-
_visitor.Visit(response);
80-
WalkContent(response.Content);
81-
82-
if (response.Links != null)
83-
{
84-
_visitor.Visit(response.Links);
85-
foreach (var link in response.Links.Values)
86-
{
87-
_visitor.Visit(link);
88-
}
89-
}
90-
}
91-
}
103+
_visitor.Visit(parameter);
92104
}
93105
}
106+
107+
WalkRequestBody(operation.RequestBody);
108+
109+
if (operation.Responses != null)
110+
{
111+
_visitor.Visit(operation.Responses);
112+
113+
foreach (var response in operation.Responses.Values)
114+
{
115+
WalkResponse(response);
116+
}
117+
118+
_visitor.Visit(operation.Responses as IOpenApiExtensible);
119+
}
94120
}
95121

96-
/// <summary>
97-
/// Walks through each media type in content and validates.
98-
/// </summary>
99-
private void WalkContent(IDictionary<string, OpenApiMediaType> content)
122+
private void WalkResponse(OpenApiResponse response)
123+
{
124+
_visitor.Visit(response);
125+
WalkContentMap(response.Content);
126+
127+
if (response.Links != null)
128+
{
129+
_visitor.Visit(response.Links);
130+
foreach (var link in response.Links.Values)
131+
{
132+
_visitor.Visit(link);
133+
}
134+
}
135+
136+
_visitor.Visit(response as IOpenApiExtensible);
137+
}
138+
139+
private void WalkRequestBody(OpenApiRequestBody requestBody)
140+
{
141+
if (requestBody != null)
142+
{
143+
_visitor.Visit(requestBody);
144+
145+
if (requestBody.Content != null)
146+
{
147+
WalkContentMap(requestBody.Content);
148+
}
149+
150+
_visitor.Visit(requestBody as IOpenApiExtensible);
151+
}
152+
}
153+
154+
private void WalkContentMap(IDictionary<string, OpenApiMediaType> content)
100155
{
101156
if (content == null)
102157
{

0 commit comments

Comments
 (0)